什么是抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,其提供一个创建一系列相关或相互依赖对象的接口,而不必指定其具体类或创建的细节。抽象工厂模式常与原型模式、单例模式和其它设计模式一起使用。
一系列工厂及其相关产品之间的关系.png抽象工厂与工厂方法的区别
抽象工厂 | 工厂方法 |
---|---|
通过对象组合创建抽象产品 | 通过类继承创建抽象产品 |
创建多系列产品 | 创建一种产品 |
必须修改父类的接口才能支持新的产品 | 子类化创建者并重载工厂方法以创建新产品 |
什么时候使用抽象工厂
当系统有多于一个的产品族,一个产品族里定义了多个产品,而系统只需要其中某一族的产品时。
抽象工厂的优缺点
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Factory
里加代码,又要在具体 Factory
的里面加代码。
抽象工厂的实现
主题切换
现在有 Dark 和 Light 两套不同风格的主题,涉及 View
、Button
和 ToolBar
,其类名为:
-
DarkView
、DarkButton
和DarkToolBar
-
LightView
、LightButton
和LightToolBar
-
定义
ThemeFactory
抽象类@interface ThemeFactory : NSObject + (ThemeFactory *) factoryWithMode:(NSString *)mode; - (UIView *) themeView; - (UIButton *) themeButton; - (UIToolbar *) themeToolbar; @end @implementation ThemeFactory + (ThemeFactory *) factoryWithMode:(NSString *)mode; { if([mode isEqualToSting:@"Dark"]){ return [DarkFactory new]; } return [LightFactory new]; } - (UIView *) themeView{ return nil; } - (UIButton *) themeButton{ return nil; } - (UIToolbar *) themeToolbar{ return nil; } @end
-
定义
DarkFactory
实体类@interface DarkFactory : ThemeFactory { } - (UIView*) themeView; - (UIButton*) themeButton; - (UIToolbar*) themeToolbar; @end @implementation DarkFactory - (UIView*) themeView { // returns a custom view for Dark return [[DarkView alloc] init]; } - (UIButton*) themeButton { // returns a custom main button for Dark return [[DarkButton alloc] init]; - (UIToolbar*) themeToolbar { // returns a custom toolbar for Dark return [[DarkToolbar alloc] init]; } @end
-
定义
LightFactory
实体类@interface LightFactory : ThemeFactory { } - (UIView*) themeView; - (UIButton*) themeButton; - (UIToolbar*) themeToolbar; @end @implementation LightFactory - (UIView*) themeView { // returns a custom view for Light return [[LightView alloc] init]; } - (UIButton*) themeButton { // returns a custom main button for Light return [[LightButton alloc] init]; - (UIToolbar*) themeToolbar { // returns a custom toolbar for Light return [[LightToolbar alloc] init]; } @end
-
获取对应主题
ThemeFactory * factory = [ThemeFactory factoryWithMode:@"Dark"]; //... UIView * view = [factory themeView]; //... put the view on a proper location in view //... UIButton * button = [factory themeButton]; //... put the button on a proper location in view //... UIToolbar * toolbar = [factory themeToolbar];
Foundation 中的类簇
类簇是 Foundation 框架广泛使用的一种设计模式。类簇将许多私有的具体子类组合在一个公共抽象超类之下。以这种方式对类进行分组简化了面向对象框架的公开可见架构,而不会降低其功能丰富性。
为了说明类簇架构及其好处,请考虑构建类层次结构的问题,该层次结构定义对象以存储不同类型的数字(char
、int
、float
、double
)。因为不同类型的数量具有许多共同特征(例如,它们可以从一种类型转换为另一种类型,并且可以表示为字符串),所以它们可以由单个类表示。但是,它们的存储要求不同,因此用同一个类来表示它们是低效的。
NSNumber
有很多 numberWith*
方法,它们都是类方法,根据传入参数生成各种 NSNumber
的实例。如何创建 NSNumber
的具体子类型的实例都是由 NSNumber
的类方法负责,由于其是在类级别提供了方法以达到类似的效果,也成为类工厂方法。
类簇基于抽象工厂设计模式,比如 NSNumber
本身是一个高度抽象的工厂,而 NSCFBoolean
和 NSCFNumber
是具体工厂子类。子类是具体工厂,因为它们重载了 NSNumber
中声明的抽象工厂方法以生产产品。
总结
抽象工厂模式可以涉及许多类型的对象创建,提供其抽象而不暴露创建过程中任何不必要的细节或所创建对象的确切类型。在抽象工厂模式中增加新的系列,直接扩展一个工厂子类及对应的抽象子类,对整个模式框架不会带来其他影响。如果增加一个新的类型,创建新的类型对应的类,并对整个抽象工厂类及其子类进行方法扩展。
网友评论