工厂方法模式,工厂的父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,即通过不同的工厂子类创建不同的产品对象.
角色:
- Product:抽象产品
- ConcreteProduct:具体产品
- Factory:抽象工厂
- ConcreteFactory:具体工厂
举例:工厂方法是对工厂进行抽象化,即有一个抽象的工厂类负责定义具体的工厂创建方法.如:富士康不在是一个代工厂, 而是一个抽象的工厂,这个抽象的工厂衍生出两个具体的工厂,一个富士康iPhone生产厂,一个富士康miPhone生产厂,iPhone厂负责生产iPhone,miPhone厂负责生产miPhone.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| // 工厂抽象类 @interface Factory : NSObject
+ (Phone *)createPhone;
@end
@implementation Factory
+ (Phone *)createPhone { // 返回抽象的Phone并无意义,因此返回nil return nil; }
@end
// iPhone工厂 @interface iPhoneFactory : Factory @end
@implementation iPhoneFactory
+ (Phone *)createPhone { return [iPhone new]; }
@end
// miPhone工厂 @interface miPhoneFactory : Factory @end
@implementation miPhoneFactory
+ (Phone *)createPhone { return [miPhoneFactory new]; }
@end
|
使用:
1 2 3 4
| // 创建苹果手机对象 Phone *phone = [iPhoneFactory createPhone]; // 创建小米手机对象 Phone *mi = [miPhoneFactory createPhone];
|
对应的结构图如下:
优点:
- 屏蔽了产品创建的具体细节,用户只需要关心所需产品对应的工厂即可
- 当有新的产品时,无需修改抽象工厂的方法,只需要添加一个具体的工厂和具体的产品即可,符合开闭原则
缺点:
- 当系统加入新产品时,需要提供对象的产品类和具体的工厂, 增加了类的个数
总结:
- 工厂方法解决了简单工厂开闭原则的问题, 另外突出一个动态, 动态仔细品.
(完)