1.定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。



2.适用场景

1.一个系统要独立于它的产品创建、组合和表示。
2.一个系统要由多个产品系列中的一个来配置。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现。



3.评价

1.它分离了具体的类
2.它使得易于交换产品系列
3.它有利于产品的一致性
4.难以支持新种类的产品
5."开放-封闭"原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
  增加产品族:Abstract Factory很好的支持了"开放-封闭"原则。
  增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
  综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。



为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:

 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式_商业

图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。


4. 模式结构

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式_工厂方法模式_02

1.抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
2.具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
3.抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4.具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。



所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用图来描述的话,如下图:

 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式_抽象工厂_03


5.案例说明

(1)

在抽象工厂模式中,每个ConcreteCreator只生产一种具体的产品,好似宝马的生产车间,只生产宝马汽车,而不会生产奔驰汽车,同样的奔驰的生产车间也只能生产奔驰汽车而不会生产宝马汽车,这里宝马和奔驰的生产车间都用相同的构造模式,即他们都是继承实现了Creator,对于product来说,我只是知道需要一辆奔驰,但是并不关心这辆车在哪个车间生产的。Factory Pattern跟Abstract Factory Pattern的区别可以用宝马和奔驰两个生产工厂来比对。 在Factory Pattern里面,用户只要我要求从奔驰车间还是宝马车间里提供一个产品,也就是说产品的种类已经在用户那里指定了。在Abstract Factory Pattern里面,用户不会去指定我要的产品是从宝马还是奔驰的车间里出来。


(2)

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式_商业_04

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式_商业_05


6.代码举例

  文献[5]中代码较为详细。





作者:木木