`
leonzhx
  • 浏览: 793902 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

1.    抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。抽象工厂模式的简略类图如下:


  
2.    抽象工厂模式提供多个具体工厂角色,分别对应于每个抽象产品角色下的多个具体产品角色。每一个具体工厂角色仅负责每个抽象产品角色下的某一个具体产品角色的实例化。每一个具体工厂类负责创建抽象产品的某一个具体子类的实例:
 

 
涂有阴影的具体产品属于同一个产品族。

 

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

 

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



 

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

 

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


  
6.    一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象对应于每一个产品族都有一个具体工厂。而每一个具体工厂负责创建属于同一个产品族、但是分属于不同等级结构的产品。
 

 
 
7.    采用抽象工厂模式设计出的系统类图如下:



    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 产品族中的产品:
 

 

 

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

 

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

 
 

14.    Java AWT库中的应用:
在Java 的AWT 库中,定义了两套平行的等级结构;一套是Java 的构件,以Component为超类,另一套是所谓的peer 构件,以ComponentPeer 为超类。Java 构件向Java 程序提供一套与操作系统无关的、统一的构件接口;而peer 构件则处理底层的、与操作系统密切相关的功能。每有一个Java 视窗构件,就有一个对应的peer 接口;而这个接口在不同的操作系统中有不同的实现。在运行时,Peer 架构会自行产生一个对应于当前操作系统的Toolkit 对象。在运行时,Peer 架构会自行调用这个Toolkit 对象,创建出所需要的peer 对象。在下面的图中,Component 类型和ComponentPeer 类型通过Toolkit 对象相互通讯:
 

 
每一个支持Java 的操作系统都必须提供一个Toolkit 的具体子类。这些Toolkit的具体类构成了工厂等级结构,而这个等级结构的超类是java.awt.Toolkit。以ButtonPeer 和LabelPeer 等级结构;以及四个产品族(Windows 产品族,Solaris/Motif 产品族,以及Unix/OpenWin 产品族)为例:
 

 

 
 

  • 大小: 14.1 KB
  • 大小: 60.2 KB
  • 大小: 94.2 KB
  • 大小: 51.3 KB
  • 大小: 85 KB
  • 大小: 50.3 KB
  • 大小: 44 KB
  • 大小: 41.5 KB
  • 大小: 40.7 KB
  • 大小: 37 KB
  • 大小: 88.1 KB
  • 大小: 71.2 KB
  • 大小: 79.3 KB
分享到:
评论

相关推荐

    Java与模式

    第14章 抽象工厂\(Abstract Factory\)模式 第15章 单例\(Singleton\)模式 第16章 专题:单例模式与MX记录 第17章 专题:多例\(Multiton\)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 ...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163 第20章 操作型模式介绍 176 第21章 模板方法(template method)模式 182 第22章 状态(state)模式 193 第...

    [源代码] 《易学 设计模式》 随书源代码

    第05章 再接再厉:抽象工厂模式 (AbstractFactory) 第06章 孜孜不倦:创建者模式 (Builder) 第07章 照猫画虎:原型模式 (Prototype) 第08章 独一无二:单例模式 (Singleton) 第09章 一目了然:外观模式 (Facade) 第...

    研磨设计模式(完整带书签).part2.pdf

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式(完整带书签).part1.pdf

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式-part2

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式-part4

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式-part3

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式.part3(共4个)

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 ...

    研磨设计模式.part2(共4个)

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 ...

    研磨设计模式.part4(共4个)

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 ...

    研磨设计模式.part1(共4个)

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 ...

    C#设计模式_设计模式_C#_

    抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ...

    Delphi模式编程第一分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象工厂模式 ...

    Delphi模式编程第二分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象...

    第四章:Spring AOP API 设计模式1

    1. **抽象工厂模式(Abstract Factory)**:Spring AOP框架中的`AopProxyFactory`接口代表抽象工厂,如`DefaultAopProxyFactory`是其实现,负责创建代理对象。抽象工厂模式确保了客户端无需关注具体对象的创建细节,...

    java设计模式(电子书)

    第6章抽象工厂模式(ABSTRACT FACTORY PATTERN):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。它有助于保持系统的独立性,因为更换产品族时,无需修改使用工厂的客户代码。 第7章门面...

    第14讲谈谈你知道的设计模式1

    创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)等。 结构型模式,是针对软件...

Global site tag (gtag.js) - Google Analytics