抽象工厂模式

来源:互联网 发布:社交网络下载 编辑:程序博客网 时间:2024/05/01 12:11
抽象工厂模式的用意:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定具体产品类型的情况下,创建多个产品族中的对象。

抽象工厂名字的来源:
“抽象”来自“抽象产品角色”,“抽象工厂”就是“抽象产品角色的工厂”。

每一种模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多个产品等级结构的系统设计。

与工厂方法模式的区别:
抽象工厂与工厂方法模式具有相同的角色。
抽象工厂模式与工厂方法模式最大的区别是:工厂方法模式针对的是一个产品等级结构;而抽象工厂模式需要面对多个产品等级结构。
工厂方法中,当增加一个新的产品等级结构时,就对应的需要为之增加一个新的工厂。
而在抽象工厂中,可以用一个工厂来创建同分属于多个产品结构的一个产品族的所有对象。这正是抽象工厂的好处。

产品族:
所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。
比如:视窗构件中包含Button和Text, 而Unix和Windows下面的视窗构件又不一样的本地实现。那么,Button和Text作为不同的产品等级结构,而Unix和Windows是不同的产品族。(这是抽象工厂模式的起源)
在抽象工厂模式中,一个产品族对应一个具体的工厂角色,一个工厂角色负责创建同一个产品族下的所有的产品结构的对象。

在什么情形下使用抽象工厂:
1. 一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节。这对于所有形态的工厂模式都是重要的。
2. 这个系统有多于一个的产品族,而系统只消费其中某一族的产品(抽象工厂的原始用意。即只会消费Unix或Windows其中一个产品族下的所有产品)
3. 同属于同一个产品族的产品是在一起使用的。这一约束必须要系统的设计中体现出来。
4. 系统提供一个产品类的库,所有的产品以同样的接口出现,使客户端不依赖于实现。

对“开-闭”原则的支持:
增加新的产品族:
         一个产品族对应一个具体工厂角色,当新增一个产品族时,我们只需要在产品等级结构中加入一个新的实现即可,无需改动已有的产品。 相对应的增加一个具体的工厂角色,来创建这个产品族下的所有产品结构的对象。无须改动客户端以及已有的工厂角色。支持“开-闭”原则。
增加新的产品等级结构:
         因为每一个具体工厂类都负责创建某一产品族下所有产品等级结构的对象。当新增一个产品等级结构时,我们不得不为每一个具体工厂角色增加一个新的工厂方法,用来创建新增的产品等级结构的对象。不支持”开-闭“原则。

 
原创粉丝点击