读书人

第十四章 抽象工场(Abstract Factory

发布时间: 2013-02-02 12:27:16 作者: rapoo

第十四章 抽象工厂(Abstract Factory)模式

??
2.??? 抽象工厂模式提供多个具体工厂角色,分别对应于每个抽象产品角色下的多个具体产品角色。每一个具体工厂角色仅负责每个抽象产品角色下的某一个具体产品角色的实例化。每一个具体工厂类负责创建抽象产品的某一个具体子类的实例:
?
第十四章 抽象工场(Abstract Factory)模式
?
涂有阴影的具体产品属于同一个产品族。

?

3.??? 抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

?

4.??? 所谓产品族(Product Family),是指位于不同产品等级结构中,功能相关联的产品组成的家族:


第十四章 抽象工场(Abstract Factory)模式
?

?上图中箭头所指就是三个功能相关联的产品,它们位于三个不同的等级结构中的相同位置上,组成一个产品族。

?

5.??? 每一个产品族中含有产品的数目,与产品等级结构的数目是相等的。产品的等级结构和产品族将产品按照不同方向划分,形成一个二维的坐标系:

第十四章 抽象工场(Abstract Factory)模式
??
6.??? 一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象对应于每一个产品族都有一个具体工厂。而每一个具体工厂负责创建属于同一个产品族、但是分属于不同等级结构的产品。
?
第十四章 抽象工场(Abstract Factory)模式
?第十四章 抽象工场(Abstract Factory)模式
?
7.??? 采用抽象工厂模式设计出的系统类图如下:


第十四章 抽象工场(Abstract Factory)模式
??? a) 抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java 接口或者抽象Java 类实现,而所有的具体工厂类必须实现这个Java 接口或继承这个抽象Java 类。
??? b) 具体工厂类(Conrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java 类实现这个角色。
??? c) 抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java 接口或者抽象Java 类实现这一角色。

??? d) 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java 类实现这个角色。

?

8.??? 在以下情况下应当考虑使用抽象工厂模式:
??? a)??? 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;
??? b)??? 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
??? c)??? 同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体
现出来;
??? d)??? 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖
于实现。

?

9.??? 抽象工厂模式的起源或者说最早的应用,是用于创建分属于不同操作系统的视窗构件(比如button, text, dropdown list等等)。在UNIX 操作系统的视窗环境和Windows 操作系统的视窗环境中,这两个构件有不同的本地实现,它们的细节也有所不同。在每一个操作系统中,都有一个视窗构件组成的构件家族。系统对产品对象的创建需求由一个工厂的等级结构满足;其中有两个具体工厂角色,即UnixFactory 和WinFactory。其中UnixFactory 对象负责创建Unix 产品族中的产品,而WinFactory 对象负责创建Windows 产品族中的产品:
?
第十四章 抽象工场(Abstract Factory)模式
?

?

10.??? 在现代的应用中,抽象工厂模式的使用范围已经大大扩大了,不再要求系统只能消费某一个产品族了。

?

11.??? 在产品等级结构的数目不变的情况下,增加新的产品族,就意味着在每一个产品等级结构中增加一个(或者多个)新的具体(或者抽象和具体)产品角色。设计师只需要向系统中加入新的具体工厂类就可以了,没有必要修改已有的工厂角色或者产品角色。在产品族的数目不变的情况下,增加新的产品等级结构。换言之,所有的产品等级结构中的产品数目不会改变,但是现在多出一个与现有的产品等级结构平行的新的产品等级结构。因此,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
12.??? 抽象工厂角色可以配备一个静态方法,这个方法按照参量的值,返回所对应的具体工厂的实例。静态方法的返还类型是抽象工厂类型,这样可以在多态性的保证之下,允许静态工厂方法自行决定哪一个具体工厂符合要求。
13.??? 工厂方法模式与简单工厂模式的相图如下:
?
第十四章 抽象工场(Abstract Factory)模式
?第十四章 抽象工场(Abstract Factory)模式
?

14.??? Java AWT库中的应用:
在Java 的AWT 库中,定义了两套平行的等级结构;一套是Java 的构件,以Component为超类,另一套是所谓的peer 构件,以ComponentPeer 为超类。Java 构件向Java 程序提供一套与操作系统无关的、统一的构件接口;而peer 构件则处理底层的、与操作系统密切相关的功能。每有一个Java 视窗构件,就有一个对应的peer 接口;而这个接口在不同的操作系统中有不同的实现。在运行时,Peer 架构会自行产生一个对应于当前操作系统的Toolkit 对象。在运行时,Peer 架构会自行调用这个Toolkit 对象,创建出所需要的peer 对象。在下面的图中,Component 类型和ComponentPeer 类型通过Toolkit 对象相互通讯:
?
第十四章 抽象工场(Abstract Factory)模式
?
每一个支持Java 的操作系统都必须提供一个Toolkit 的具体子类。这些Toolkit的具体类构成了工厂等级结构,而这个等级结构的超类是java.awt.Toolkit。以ButtonPeer 和LabelPeer 等级结构;以及四个产品族(Windows 产品族,Solaris/Motif 产品族,以及Unix/OpenWin 产品族)为例:
?
第十四章 抽象工场(Abstract Factory)模式
?
第十四章 抽象工场(Abstract Factory)模式
?
?

读书人网 >编程

热点推荐