Опитвам се да се справя по-добре с фабричния модел, както е илюстриран тук:
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