WHAT工厂方法模式:
工厂方法模式:在工厂父类中定义创建对象的公共接口,而子类则负责生成具体的对象。这样做的目的是将类的实例化操作延迟到子类中完成,即通过子类来确定究竟应该实例化哪一个类。Objective-C
中的最出名的工厂方法模式莫过于NSNumber
Category中的类工厂方法。
@interface NSNumber (NSNumberCreation)
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
-
传统的工厂方法模式如下图:
Factory Method Pattern
在结合上图,我们可以很清晰的知道何为工厂方法模式:
父类(Product)中定义好创建对象的公共接口,交由子类(Product)实现。
Creator
中声明了抽象的工厂方法,每个ConcreteCreator
中实现抽象工厂中定义的工厂方法。生成返回一个对应Product
的对象。每个工厂对应的生产一种产品。
这种模式的缺陷就在于每多一种产品必须有一个新的ConcreteProduct
和 对应的ConcreteCreator
来实现。增加了项目的复杂度。
在工厂方法模式中存在四个的角色:
- 抽象父类(Product):是工厂方法模式所创建对象的超类,即对象的共同父类(NSNumber)。
- 具体子类(ConcreteProduct): 具体子类实现了抽象父类的接口,子类的对象一般与具体工厂的方法一一对应。
- 抽象工厂(Creator): 抽象工厂中声明了工厂方法,用于具体工厂实现,返回一个实例。
- 具体工厂(ConcreteCreator): 具体工厂中实现了抽象工厂中定义的工厂方法,返回具体类的实例。
- 在
NSNumber
的类工厂方法属于工厂方法的变体,苹果用Category方式向开发者隐藏了具体子类实现的细节。这些类工厂方法,只是NSNumber
提供用于生成对象的便捷方法,并不是用来子类重写的。
WHEN工厂方法模式:
- 在编译期的时候无法准确的确定要创建哪个类的对象。
- 开发者想要在运行时由子类来创建对象。
- 我们不需要知道也不关心具体类的类名(如:NSCFBoolean),只要知道所对应的工厂方法(如:
numberWithBool:
)就能通过其子类来指定创建哪个对象。
网友评论