本帖最后由 Chenxs110 于 2012-8-18 10:39 编辑
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中定义了创建接口:class WidgetFactory
{
public:
virtual ScrollBar * CreateScrollBar() = 0;
virtual Window * CreateWindow() = 0;
WidgetFactory();
virtual ~WidgetFactory();
};
XstyleWidgetFactory和YstyleWidgetFactory分别重写了虚拟函数用来创建指定视觉效果的产品:ScrollBar * XstyleWidgetFactory::CreateScrollBar()
{
return new XstyleScrollBar;
}
Window * XstyleWidgetFactory::CreateWindow()
{
return new XstyleWindow;
}
<span style="background-color: rgb(255, 255, 255); ">YstyleWidgetFactory</span> :
Window * YstyleWidgetFactory::CreateWindow()
{
return new YstyleWindow;
}
ScrollBar * YstyleWidgetFactory::CreateScrollBar()
{
return new YstyleScrollBar;
}
我们还有两个抽象产品类Window和ScrollBarclass Window
{
public:
Window();
virtual ~Window();
};
class ScrollBar
{
public:
ScrollBar();
virtual ~ScrollBar();
};
这里简化了,没添加属性和方法.
XtyleWindow YstyleWindow XstyleScrollBar YstleScrollBar分别继承自Window和ScrollBar
看看客户端的代码#include "Window.h"
#include "ScrollBar.h"
#include "XstyleWidgetFactory.h"
#include "YstyleWidgetFactory.h"
int main()
{
WidgetFactory * X = new XstyleWidgetFactory;
WidgetFactory * Y = new YstyleWidgetFactory;
Window * X1 = X->CreateWindow();
ScrollBar * Y1 = Y->CreateScrollBar();
return 1;
}
客户端代码中,没有指定具体的产品类(XsytleWindow和YstyleScrollBar)吧.而且还提供了一系列的接口CreateWindow和CreateScrollBar.
而且这里我们还可以把单例模式用进去.将XstyleWidgetFactory具体的工厂类设计成单例.因为我们只需要一个全局的接口就好了.不需要
存在多个具体工厂类的实例.
|