在上一篇工厂模式中,我开了一家pizza店,生意非常好哇,然后我就想着在国内多开几家分店。但是,问题来了,我如何确保每个地方pizza原材料的质量呢?接下来 我们可以使用抽象工厂方法来解决这个问题。
1、定义
抽象工厂模式:提供一个借口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产品的具体产品是什么。这样一来,客户就从具体的产品中解耦。
2、使用场景
前言中我也说道了,我的店目前要在全国到处都开分店,如何保证使用高质量的原材料,保证我的pizza的口味。
因此,我决定在全国各地建造原料加工厂,这时又有另外一个问题需要我考虑?如何保证每一个加工厂的材料标准。因此,我决定要制作一套各种口味pizza的制作标准,同时根据地理位置的不同做一些改变。
这样的话,如果需要新建加工厂只需要让这个加工厂按照我制作的这个标准对食材进行加工即可(具体的加工厂要遵照我指定的协议,实现协议中的各原材料的制作方法)。
结合前面的工厂模式,我只需要在创建各类Pizza的时候将就近的Pizza的加工厂传递过去就可以达到就近取材就近加工的目的了。
3、思考
1、如果我有一个协议,让每一个加工厂都遵守这个协议,那么是不是意味着,如果某一个加工厂需要修改东西我就需要在这个协议中做相应的修改,或者说我要加一个新的pizza,我需要修改协议和相应的类这可能会导致我修改很多类!
的确是这样的,因为我们使用抽象工厂就是要把很多相关的内容做一个集合,这就要求我们的这个接口必须 全
。这也是抽象工厂模式的一个弊端!
2、感觉跟工厂模式的区别只在于一个使用了类的继承,另一个使用了对象的组合?
首先,两者的功能都是把应用程序从特定的实现中解耦出来。工厂模式是通过子类创建对象,客户只需要知道抽象类型,子类去负责具体类型。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的实例定义产品被生产的方法。
4、具体实现
下面我们重新整理一下整个点餐的过程
1、创建一个store的实例
PizzaStore *store = [[BJPizzaStore alloc] init];
2、用户点单
[store orderPizza:1];
3、制作Pizza
Pizza *pizza = [self createPizza:1];
4、createPizza的具体实现
Pizza *pizza = [[BJCheesePizza alloc] initWith:BJFactory];
这里BJFactory是提前创建好的一个加工厂的实例对象。
5、调用BJFactory的准备原材料的方法
- (void)prepare{
dough = [factory createDough];
sauce = [factory createSauce];
}
6、继续接着调用工厂方法中封装的那一套。