<漫谈设计模式>======对象创建型模式之抽象工厂模式

来源:互联网 发布:php 服务器文件管理 编辑:程序博客网 时间:2024/04/30 07:18



AbstractFactory(抽象工厂模式)
1.意图
   提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.(注意关键字"一系列"就是与工厂方法模式的区别)


2.动机
   考虑一个支持多种视觉效果的用户界面工具包.不同视觉效果为诸如滚动条、窗口和按钮等用户界面窗口组件定义不同的外观和行为.
为了保证视觉效果标准之间的可移植性,一个应用不应该为一个特定的视觉效果硬编码它的窗口组件.在整个应用中实例化特定视觉效果
的窗口组件类将使得以后很难改变视觉效果.
   为了解决这个问题我们可以定义一个抽象的窗口组件工厂类(WidgetFactory),这个类声明了一个用来创建每一类基本窗口组件的接口.
(CreateScrollBar创建滚动条CreateWindow创建窗口).每一类创建组件都有一个抽象类,而具体子类则实现了窗口组件的特定视觉效果.
对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作(对象创建型嘛,就是做这个的).客户调用这些操作

可以获得窗口组件实例,但是他们并不知道目前正在使用的是哪些具体的类.(无需指定它们具体的类).UML图如下:


3.适用范围

<1>一个系统要独立于它的产品的创建、组合和表示时.
<2>一个系统要由多个产品系列中的一个来配置时.
<3>当你要强调一系列相关的产品对象的设计以便进行联合使用时.
<4>当你提供一个产品类库,而只想显示他们的接口而不是实现时.

4.结构图

 

5.实现           
   以最上面那个UML图为例.在这个实现中,我们有两种抽象的产品Window和Scrollbar.具体到视觉效果又分了Xstyle和Ystyle.所以具体产品就有4个.
我们还需要为这两种不同类别的产品提供创建接口.而无需指定它们具体的类.既然有两种风格.我们这里直接定义XstyleWidgetFactory和YstyleWidgetFactory
分别用来生产Xstyle和Ystyle风格的产品.

WidgetFactory中定义了创建接口:
  1. class WidgetFactory  
  2. {
  3. public:
  4.         virtual ScrollBar * CreateScrollBar() = 0;
  5.         virtual Window * CreateWindow() = 0;
  6.         WidgetFactory();
  7.         virtual ~WidgetFactory();

  8. };
复制代码
XstyleWidgetFactory和YstyleWidgetFactory分别重写了虚拟函数用来创建指定视觉效果的产品:
  1. ScrollBar * XstyleWidgetFactory::CreateScrollBar()
  2. {
  3.         return new XstyleScrollBar;
  4. }

  5. Window * XstyleWidgetFactory::CreateWindow()
  6. {
  7.         return new XstyleWindow;
  8. }

  9. <span style="background-color: rgb(255, 255, 255); ">YstyleWidgetFactory</span> :
  10. Window * YstyleWidgetFactory::CreateWindow()
  11. {
  12.         return new YstyleWindow;
  13. }

  14. ScrollBar * YstyleWidgetFactory::CreateScrollBar()
  15. {
  16.         return new YstyleScrollBar;
  17. }
复制代码
我们还有两个抽象产品类Window和ScrollBar
  1. class Window  
  2. {
  3. public:
  4.         Window();
  5.         virtual ~Window();

  6. };
复制代码
  1. class ScrollBar  
  2. {
  3. public:
  4.         ScrollBar();
  5.         virtual ~ScrollBar();

  6. };
复制代码
这里简化了,没添加属性和方法.
XtyleWindow YstyleWindow XstyleScrollBar YstleScrollBar分别继承自Window和ScrollBar
看看客户端的代码
  1. #include "Window.h"
  2. #include "ScrollBar.h"
  3. #include "XstyleWidgetFactory.h"
  4. #include "YstyleWidgetFactory.h"

  5. int main()
  6. {
  7.         WidgetFactory * X = new XstyleWidgetFactory;
  8.         WidgetFactory * Y = new YstyleWidgetFactory;
  9.         Window * X1 = X->CreateWindow();
  10.         ScrollBar * Y1 = Y->CreateScrollBar();
  11.         return 1;
  12. }
复制代码
客户端代码中,没有指定具体的产品类(XsytleWindow和YstyleScrollBar)吧.而且还提供了一系列的接口CreateWindow和CreateScrollBar.
而且这里我们还可以把单例模式用进去.将XstyleWidgetFactory具体的工厂类设计成单例.因为我们只需要一个全局的接口就好了.不需要
存在多个具体工厂类的实例. 
原创粉丝点击