抽象工厂模式
是什么
是工厂方法设计模式的一种扩展。当有多个抽象角色时,使用的一种工厂模式。
抽象工厂
- AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
- ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
- AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
- ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
产品族和等级结构示意图
- 产品等级结构:产品等级结构即产品的继承结构(三种品牌汽车构成了三个不同的产品等级结构)
- 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如(suv工厂里生产的三个品牌车型)
怎么用
第三年:audi,benz,bmw告诉厂长,我们这次的订单需要分成suv,business,sport三种类型的车。这时候管理蛮不过来了。所以厂子又请了两个管理。分别管理三个品牌的车子。
// 抽象工厂两种情况同工厂方法上
// method 1
SUVFactory *suvf = [[SUVFactory alloc] init];
[suvf createAudiCar];
// method 2
AbstractFactorys *af = [[SportsFactorys alloc] init];
[af CreateAudiFactoy];
#import <Foundation/Foundation.h>
@interface AbstractFactorys : NSObject
//抽象工厂(三个管理者)
-(void)CreateBenzFactoy;
-(void)CreateBMWFactoy;
-(void)CreateAudiFactoy;
@end
#import "SUVFactory.h"
//具体工厂
@implementation SUVFactory
-(void)createBenzCar{
NSLog(@"抽象工厂方法生产了benzSUV");
}
-(void)createBWMCar{
NSLog(@"抽象工厂方法生产了BWMSUV");
}
-(void)createAudiCar{
NSLog(@"抽象工厂方法生产了AudiSUV");
}
@end
为什么
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率,如使用工厂方法模式,上图所示结构需要提供15个具体工厂,而使用抽象工厂模式只需要提供3个具体工厂。
当增加新的产品族的时候,符合“开闭原则”,只需让产品继承相应的抽象产品,对象的工厂继承抽象工厂即可,而无需修改其他的代码。
当增加产品等级结构的时候,不符合“开闭原则”,如新添加大众,那么在soprt,suv,business三个具体工厂里面都进行修改。当然我们可以配合反射机制来对抽象工厂进行优化。
//根据字符串来创建类
NSClassFromString(<#NSString * _Nonnull aClassName#>)```
----
###总结
简单工厂启示是工厂方法的一种极端实现,工厂方法是抽象方法的一种极端实现。在实际项目中,如果不是项目过大或者功能过于复杂,抽象工厂设计模式一般使用不到。简单工厂模式反而是用的比较频繁。但是这种思想我们还是需要借鉴的。在CoCoa Touch框架中的'类簇'便是基于抽象工厂模式设计。NSNumber就是最好的例子。
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSLog(@"%@",[[boolNumber class] description]);
// 输出 __NSCFBoolean
NSLog(@"%d",[boolNumber boolValue]);
//输出1
NSNumber(抽象工厂)->NSCFBoolean(具体工厂子类)-> 重载boolValue工厂方法 ->返回实际产品
这种设计多类型的对象的创建。好的模式应该是变成一种抽象,不暴露创建过程中任何不必要的细节和创建对象的具体类型。
ps:最后厂长去打lol了
都看到最后了还不给个喜欢么……
[demo](https://github.com/Xmanzn/Design-Patterns)