有几点需要明确:
1. 客户端按族来创建产品(通过类图,可以看到)而工厂方法(简单工作)所对应的产品,是没有产品族的概念的,
或者说,不是按产品族(产品功能)来创建产品的。
2. 这些产品不能抽象到一个接口或抽象类中
这是,需要使用抽象工厂来完成产品的创建。
在以下情况下应该考虑使用抽象工厂模式:
- 一个系统不应该依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
- 同属于同一个产品族的产品是在一起时用的,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
开-闭原则要求一个软件系统在不修改原有代码的情况下,通过扩展达到增强功能的目的。与iyuyige设计到多个产品等级结构和多个产品族的系统,其功能的增强无外乎是增加新的产品族,和增加新的等级结构。
- 增加新的产品族,只需要在每个产品等级结构中增加新的具体产品角色。然后加入新的具体工厂就可以了。
- 增加新的产品等级结构,需要多出一个与现有的产品等级结构平行的新的产品等级结构。而且需要给每个工厂类添加新的工厂方法,而这是违背"开-闭"原则的。
- 综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
采用抽象工厂模式设计出的系统类图如下所示: