抽象工厂模式:提供一个接口,用户创建相关或者依赖对象的家族,而不需要明确具体类型。
抽象工厂模式允许客户使用抽象的接口创建一组相关的产品,而不需要关心产出的具体产品是什么。这样一来客户就从具体的产品中解耦了出来。
抽象工厂模式还是举水果公司的栗子
有一家水果公司的生意做的很大,在全球生产水果在国内销售。
在国内生产国产水果,在美国生产美国水果。
如果把国内生产水果和美国生产水果的逻辑放到一起,会不方便管理。我们不能期望在美国按中国的方式来生产。
所以这里我们将生产过程由子类来实现,即我们提供一个美国的水果工厂和国产水果工厂。而各工厂分别生产苹果,橘子,桃子(假设这些类型没有太多的联系)。
回顾工厂方法模式我们不难发现代码中我们用了一个空的Fruit协议。空的Fruit协议提供了一个多态转换的能力,如果没有这个协议呢?
那么苹果是苹果,橘子是橘子,桃子是,桃子不过确实,他们除了能吃外没有更多本质上的联系。
当然并不能完全这么理解,工厂方法的本质是生产对象,所以侧重在对象上。而抽象工厂模式是提供了一个生产产品族的思路,所以抽象工厂模式提供的是一组产品的接口。
抽象工厂的协议 用来创建产品族
#import <Foundation/Foundation.h>
#import "Apple.h"
#import "Orange.h"
#import "Peach.h"
NS_ASSUME_NONNULL_BEGIN
@protocol FruitAbstractFactory <NSObject>
//定义一个接口用于创建一个系列的产品簇,而不需要之名其具体类型
+(Apple *)createApple;
+(Orange *)createOrange;
+(Peach *)createPeach;
@end
NS_ASSUME_NONNULL_END
抽象工厂的具体子类实现 实现中的具体的产品可以参考工厂方法模式
#import "ChineseAbstracFactory.h"
#import "ChineseApple.h"
#import "ChinesePeach.h"
#import "ChineseOrange.h"
@implementation ChineseAbstracFactory
+(Apple *)createApple {
Apple * fruit = [[ChineseApple alloc] init];
return fruit;
}
+(Peach *)createPeach {
Peach * fruit = [[ChinesePeach alloc] init];
return fruit;
}
+(Orange *)createOrange {
Orange * fruit = [[ChineseOrange alloc] init];
return fruit;
}
@end
具体使用
Apple *abstractApple = [ChineseAbstracFactory createApple];
Orange *abstractOrange = [ChineseAbstracFactory createOrange];
优点
1.实现了用户与工厂,具体产品的解耦
2.将产品族统一管理,方便使用
缺点
1.产品族扩展困难,需要修改抽象工厂的接口
2.增加了系统的抽象性和理解难度
网友评论