设计模式 -- 抽象工厂模式 AbstractFactory

抽象工厂模式:算是三大工厂模式中最难理解的一个了,上次校招笔试考过,但是稀里糊涂写成了简单工厂了T_T

首先看一个问题场景:

问题场景:系统里有三个组件a、b、c同时使用,但是a的同类a1、a2和a有相通的地方但是互斥,b和c也一样。一个例子就是windows和linux都有图形窗口Text和Button对象,分别是winText、winButton和linuxText、linuxButton,而winText和winButton必须在系统windows下使用,但是winButton和linuxButton又有共同点,按下后会出发事件等等。

解决方案:抽象工厂模式

       如何选用winButton或者winText,由具体工厂类winFactory负责,有选择合适的产品对象的逻辑,与应用系统的商业逻辑相关

       抽象工厂类负责定义接口,是整个抽象工厂的核心,IFactory

       winButton和linuxButton是一种产品族,有共同的特点,特点由抽象产品类接口定义Button,具体的实现由具体的产品类负责

在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。例如这里的Button和Text就是两个不同的产品族。

抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式


看结构图:


来一段例子程序:

#include <iostream>
#include <memory>

using namespace std;

//抽象工厂模式 -- 创建不同风格的对话框:windows or Mac

//抽象产品:IButton
class IButton {
public:
    virtual void draw() = 0;
};

//具体产品:WindowsButton
class WindowsButton : public IButton {
public:
    void draw() { cout << "draw Windows Button" << endl; }
};

//具体产品:MacButton
class MacButton : public IButton {
public:
    void draw() { cout << "draw Mac Button" << endl; }
};

//抽象产品:ITextBox
class ITextBox {
public:
    virtual void draw() = 0;
};

//具体产品:WindowsButton
class WindowsTextBox : public ITextBox {
public:
    void draw() { cout << "draw Windows TextBox" << endl; }
};

//具体产品:MacButton
class MacTextBox : public ITextBox {
public:
    void draw() { cout << "draw Mac TextBox" << endl; }
};


//抽象工厂:IFactory
class IFactory {
public:
    virtual shared_ptr<IButton> createButton() = 0;
    virtual shared_ptr<ITextBox> createTextBox() = 0;
};

//具体的工厂:WindowsFactory
class WindowsFactory : public IFactory {
public:
    shared_ptr<IButton> createButton() { return shared_ptr<IButton>(new WindowsButton()); }
    shared_ptr<ITextBox> createTextBox() { return shared_ptr<ITextBox>(new WindowsTextBox()); }
};

//具体的工厂:MacFactory
class MacFactory : public IFactory {
public:
    shared_ptr<IButton> createButton() { return shared_ptr<IButton>(new MacButton()); }
    shared_ptr<ITextBox> createTextBox() { return shared_ptr<ITextBox>(new MacTextBox());}
};

int main()
{
    shared_ptr<IFactory> pIFactory(new MacFactory());

    shared_ptr<IButton> pButton(pIFactory->createButton());
    shared_ptr<ITextBox> pTextBox(pIFactory->createTextBox());

    pButton->draw();  //draw Mac Button
    pTextBox->draw();  //draw Mac TextBox
    return 0;
}


注意:以上代码引用了C++11的shared_ptr,所以编译时候注意编译器有无启用C++最新标准。

另外,大话设计模式中的一个例子非常好

系统基于不同的数据库产品,访问数据,结构图如下:



最后和工厂方法比较下:

抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
    
和工厂方法区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值