Фабричен модел - Пример в Objective-C

Опитвам се да се справя по-добре с фабричния модел, както е илюстриран тук:

http://www.oodesign.com/factory-pattern.html

Примерите са на Java, а аз не съм много силен Java програмист. Най-често не разбирам реда Constructor product ... = cClass... String.class. Мисля, че разбрах „концепцията“, но аналогични ли са тези два кодови блока?

Освен това, има ли пример в Cocoa Foundation, който използва този модел? Единственият, за който се сещам, е в UIKit, който регистрира клетъчни класове срещу UITableView.

Java:

class ProductFactory
{
    private HashMap m_RegisteredProducts = new HashMap();

    public void registerProduct (String productID, Class productClass)
    {
        m_RegisteredProducts.put(productID, productClass);
    }

    public Product createProduct(String productID)
    {
        Class productClass = (Class)m_RegisteredProducts.get(productID);
        Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
        return (Product)productConstructor.newInstance(new Object[] { });
    }
}

Цел-C:

@interface ProductFactory : NSObject

- (void)registerProduct:(Class)productClass withIdentifier:(NSString *)identifier;
- (id)newProductForIdentifier:(NSString *)identifier;

@end

@interface ProductFactory();

@property (strong, nonatomic) NSMutableDictionary *registeredProducts;

@end

@implementation ProductFactory

- (id)init
{
    self = [super init];
    if (self) {
        _registeredProducts = [NSMutableDictionary dictionary];
    }

    return self;
}

- (void)registerProduct:(Class)productClass withIdentifier:(NSString *)identifier
{
    self.registeredProducts[identifier] = NSStringFromClass(productClass);
}

- (id)newProductForIdentifier:(NSString *)identifier
{
    NSString *classString = self.registeredProducts[identifier];
    Class productClass = NSClassFromString(classString);

    return [[productClass alloc] init];
}

@end

person edelaney05    schedule 20.06.2013    source източник


Отговори (1)


Да, това е общо взето аналогично. Не съм правил java от известно време, така че не мога изрично да обясня реда Constructor, но това е нещо като дефиницията на определен инициализатор и как да го намеря.

Бихте могли да поработите малко с @protocols, за да позволите набор от init методи да бъдат достъпни за инстанцията и да разпитате класа, за да видите на кой протокол отговаря (използвайки conformsToProtocol:).

person Wain    schedule 20.06.2013
comment
Страхотна идея за conformsToProtocol:! - person edelaney05; 20.06.2013