博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抽象工厂模式(Abstract Factory)
阅读量:5036 次
发布时间:2019-06-12

本文共 2113 字,大约阅读时间需要 7 分钟。

抽象工厂模式(Abstract Factory

 

抽象工厂模式(Abstract Factory[Kit]

意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

应用:用户界面工具包。

模式结构

 

心得

工厂方法把生产产品的方式封装起来了,但是一个工厂只能生产一类对象,当一个工厂需要生产多类产品的时候,就需要使用抽象工厂了。抽象工厂(AbstractFactory)类定义了一组标准的实现接口,这些接口一般都是和具体的产品类继承层次对应的。如createProductA接口只能生产抽象产品类(AbstratctProductA)的子类产品,因此抽象工厂的具体实现类之间的关系就是个生产了一批不同产品族的组合。这样通过抽象工厂模式可以方便的更换产品族,代码修改的代价只需要更换一个具体的工厂对象就可以了。因此直观上可以把抽象工厂看作一组工厂方法,它的每一个接口都可以提取出一个单独的工厂方法。不过抽象工厂除了反映出这些含义外,还隐含着多类产品之间有种内在的联系,如按钮、菜单、滚动条都是GUI组件。

举例

对于可以随意更换GUI组件库的需求,抽象工厂就可以完成类似的功能。抽象工厂类(AbstractFactory)封装了GUI组件库必须提供的接口,如创建按钮、菜单、滚动条等。GUI组件类会根据不同的窗口系统而派生具体的组件类,实现抽象工厂的具体类具体工厂类会根据不同的窗口系统选择对应的组件进行生产。这样当更换窗口系统的时候,只需要更换工厂类就能方便的实现运行时窗口系统的更换。按照这样的描述,我们可以实现的C++代码如下:

 
//产品类继承层次
class Button
{
public:
    virtual void click()=0;
    virtual ~Button(){}
};
class WindowsButton:public Button
{
public:
    virtual void click()
    {
        cout<<"单击了Windows按钮"<<endl;
    }
};
class MacButton:public Button
{
public:
    virtual void click()
    {
        cout<<"单击了Mac按钮"<<endl;
    }
};
class Menu
{
public:
    virtual void select()=0;
    virtual ~Menu(){}
};
class WindowsMenu:public Menu
{
public:
    virtual void select()
    {
        cout<<"选择了Windows菜单"<<endl;
    }
};
class MacMenu:public Menu
{
public:
    virtual void select()
    {
        cout<<"选择了Mac菜单"<<endl;
    }
};
//抽象工厂
class GUIFactory
{
public:
    virtual Button*createButton()=0;
    virtual Menu*createMenu()=0;
    virtual ~GUIFactory(){}
};
//具体的工厂
class WindowsGUIFactory:public GUIFactory
{
public:
    virtual Button*createButton()
    {
        return new WindowsButton();
    }
    virtual Menu*createMenu()
    {
        return new WindowsMenu();
    }
};
class MacGUIFactory:public GUIFactory
{
public:
    virtual Button*createButton()
    {
        return new MacButton();
    }
    virtual Menu*createMenu()
    {
        return new MacMenu();
    }
};
 

这里代码中类的继承接口和图中相同,只是为了方便理解,修改了一下类的名字。如果我们使用这段代码创建组件,就会这么写了:

 
GUIFactory*factory=new WindowsGUIFactory();//创建工厂
Button*btn=factory->createButton();//创建组件
Menu*menu=factory->createMenu();
btn->click();//调用组件函数
menu->select();
delete btn;
delete menu;
delete factory;
 

从代码中看出我们无法看到看到具体创建的组件,因为我们只需要用抽象类ButtonMenu使用标准的接口就可以了,具体的实现被工厂封装起来了。如果我们要更换所有的一批组件的话,只需要修改第一行代码,换一个工厂就可以了。

 

 

 

来源:

转载于:https://www.cnblogs.com/94julia/archive/2013/05/22/3092200.html

你可能感兴趣的文章
上周热点回顾(10.20-10.26)
查看>>
C#正则表达式引发的CPU跑高问题以及解决方法
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了...
查看>>
APScheduler调度器
查看>>
设计模式——原型模式
查看>>
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>
数据库连接
查看>>
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>
第四天 selenium的安装及使用
查看>>
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>
KMPnext数组循环节理解 HDU1358
查看>>