吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3457|回复: 2
收起左侧

[C&C++ 转载] <漫谈设计模式>======对象创建型模式之抽象工厂模式

 关闭 [复制链接]
Chenxs110 发表于 2012-8-17 23:43
本帖最后由 Chenxs110 于 2012-8-18 10:39 编辑

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


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

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

4.结构图
111111.jpg
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和ScrollBar
class 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具体的工厂类设计成单例.因为我们只需要一个全局的接口就好了.不需要
存在多个具体工厂类的实例.                                                                                                                                                                                                                                                                   







免费评分

参与人数 1热心值 +1 收起 理由
loadling + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

a-one 发表于 2012-8-17 23:56
支持一个,辛苦分享!

这么晚了,还在,,,
头像被屏蔽
pist 发表于 2012-8-18 00:56
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 16:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表