本文将从理论上讲述抽象工厂模式的基本设计原理及其适用条件。
先看一下一个典型的抽象工厂类图,看懂类图是学习和运用抽象工厂模式的最为重要的内容。
抽象工厂类图
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象,这就是其根本用意。
抽象工厂与工厂方法模式的最大区别就是:工厂方法模式针对的是一个产品等级结构;而抽象工厂则需要面对多个产品等级结构。抽象工厂可以使用同一工厂的等级结构来对付这些相同的或者极为类似的产品等级结构,这就是抽象工厂的好处。
抽象工厂对付同一等级结构的类图
考虑使用抽象工厂模式的几个情形:
* 系统不应当依赖于产品实例如何创建,组合和表达的细节
* 系统的产品有多于一个产品族,而系统只消费其中的某一族的产品
* 同一产品族的产品是在一起使用的
* 系统提供一个产品的类库,所有的产品以同样的接口出现,从而使得客户端不依赖于实现。
考虑到在软件升级和维护的过程当中,需要对系统进行升级处理,假设我们的系统在其中有一个部分设计用到的抽象工厂设计模式,那么下面我们就抽象工厂的各个角色的增加(开闭原则)的一些优点和劣势进行阐述。
情况1:增加产品族
在这种情况下,由于工厂的等级和产品的等级平行。因此在产品的等级结构出现调整的时候,也需要对工厂的等级结构进行调整。换言之,就是设计师只需要向系统中加入新的具体的工厂类就可以了没有必要修改已有的工厂角色或者产品角色。此时是支持开闭原则的。
情况2:增加新的产品等级结构
在这种情况下,对于茶农的等级结构是不支持开闭原则的,为什么这么说呢?多出一个现有的产品等级结构的情况下,就需要修改已有的工厂角色,给每一个工厂一个新的方法。所以问题就显而易见了。
总之,抽象工厂模式是工厂方法的一个拓展,抽象工厂与工厂方法模式的最大区别就是:工厂方法模式针对的是一个产品等级结构;而抽象工厂则需要面对多个产品等级结构,抽象工厂可以使用同一工厂的等级结构来对付这些相同的或者极为类似的产品等级结构,这就是抽象工厂的好处。在增加产品族的时候是支持开闭原则,而在增加新的产品等级结构就不支持开闭原则,所以在设计的时候需要综合考虑,切不可造成设计过度。