记录自己的理解:
抽象工厂中的两个概念:
- 产品等级结构
- 产品族
以海尔和海信两个公司为例,两个公司都生产电视机,那末海尔电视机
和海信电视机
就是一个产品等级结构,而海尔电视机
和海尔电冰箱
就是一个产品族。因此可以理解为海尔家的所有产品例如海尔电视机、海尔电冰箱等构成一个产品族,海尔公司看作是一个具体工厂。
另外说明抽象工厂模式对于增加新的产品族方便,增加新的产品登记结构麻烦
,有的也说横向扩展容易,纵向拓展麻烦
,根据上面的示例图也容易理解。
一般来说,一个产品等级结构都继承自一个公共的抽象类或实现一个公共接口,增加一个产品族时(看作新成立了一家公司:)),则只需要增加新的产品类和对应的具体工厂类即可;另一种情况是对着技术的发展市面上的洗衣机创新出了新的功能,如半自动洗衣机向全自动洗衣机换代,因此每个公司都将自己的洗衣机升级,此时的洗衣机功能也有所增加,在此模式下,就需要更改顶层的抽象类或接口,在其中添加新的方法,则所有的实现类也要做相应的修改,违背了”开闭原则”。
在以下情况下可以考虑使用抽象工厂模式:
(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。
(4)产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。