设计模式 - 抽象工厂模式(Abstract Factory) C++实现

抽象工厂模式(Abstract Factory)

意图:提供一个创建 一系列相关或相互依赖对象的接口。
之前的工厂方法模式,每增加一个产品,就需要增加一个具体产品类和一个对于工厂类。
对于一些情况,比如设计一个UI库,有按钮、滚动条等组件,为了让程序更加个性化,需要实现程序可以换皮肤的功能,比如蓝色主题、红色主题等,而且要便于拓展新的主题。
如果用工厂方法模式来实现的话,对每个组件都要一个相应的工厂类,而且各个组件之间是存在关联的,比如蓝色主题的button和scrollbar之间可以看出一些列的,要实现统一的话,分别管理各个工厂比较麻烦,这时候就可以用抽象工厂模式了。
相比工厂方法模式,抽象工厂模式提供了创建 一系列相关产品的接口,而不像工厂方法模式只提供创建 一种产品的接口。
对于这个例子,一个抽象工厂提供了创建Button、Scrollbar等产品的接口。

UML图:


C++实现:

#include <assert.h>
#include <iostream>

using namespace std;

class AbsButton {
public :
    virtual void draw() = 0;
};

class AbsScrollBar {
public :
    virtual void draw() = 0;
};

class WidgetFactory {
public :
    virtual AbsButton * createButton() = 0;
    virtual AbsScrollBar * createScrollBar() = 0;
};

class BlueButton : public AbsButton {
public :
    virtual void draw() {
        cout << "Blue Button" << endl;
    }
};

class BlueScrollBar : public AbsScrollBar {
public :
    virtual void draw() {
        cout << "Blue ScrollBar" << endl;
    }
};

class BlueWidgetFactory : public WidgetFactory {
public :
    virtual AbsButton * createButton() {
        return new BlueButton();
    }
    virtual AbsScrollBar * createScrollBar() {
        return new BlueScrollBar();
    }
};

class RedButton : public AbsButton {
public :
    virtual void draw() {
        cout << "Red Button" << endl;
    }
};

class RedScrollBar : public AbsScrollBar {
public :
    virtual void draw() {
        cout << "Red ScrollBar" << endl;
    }
};

class RedWidgetFactory : public WidgetFactory {
public :
    virtual AbsButton * createButton() {
        return new RedButton();
    }
    virtual AbsScrollBar * createScrollBar() {
        return new RedScrollBar();
    }
};

int main() {
    WidgetFactory * factory = new BlueWidgetFactory();
    assert(factory != NULL);
    AbsButton * button = factory->createButton();
    assert(button != NULL);
    AbsScrollBar * scrollbar = factory->createScrollBar();
    assert(scrollbar != NULL);

    button->draw();
    scrollbar->draw();


    delete factory;
    factory = NULL;
    factory = new RedWidgetFactory();
    assert(factory != NULL);

    delete button;
    button = NULL;
    button = factory->createButton();
    assert(button != NULL);

    delete scrollbar;
    scrollbar = NULL;
    scrollbar = factory->createScrollBar();
    assert(scrollbar != NULL);

    button->draw();
    scrollbar->draw();

    delete factory;
    factory = NULL;
    delete button;
    button = NULL;
    delete scrollbar;
    scrollbar = NULL;

    return 0;
}

运行结果:




优点:相比工厂方法模式,抽象工厂减少了类的数量,也便于统一管理相关的产品。
缺点:当需要增加一种产品的时候,就不符合开闭原则了。


Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来处理一些问题。抽象出一些类的公共接口作为抽象基类或者接口。这 样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂 后,我们可能将无法维护子类的创建),最终我们在程序的扩展和维护成本上的开销将变得越来越大,越来越难。 我们知道经常“某个对象”由于需求的变化,对象的具体实现面临着剧烈的变化。为了应对这种变化我们抽象出它比较稳定的接口 ,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的 Factory模式了。 我们一直在使用电脑。电脑大致上是分鼠标、键盘、显示器和主机几个部分构成。每个部件以有很多厂商生产,如DELL、ASUS、HP 等等。利用Abstract Factory模式我们可以通过不同的工大生产出一整套的产品。如DELLFactory里,生产出来的鼠标、键盘、显示 器和主机产品都是DELL牌的(这样视乎就是DELL牌电脑了呢,哈哈!)。我不相信DELL的键盘,那就用HP的话,可以在HPFactory里 生产出HP的键盘和鼠标,然后自行组装。 详细见博客 http://blog.csdn.net/xiaoting451292510/article/details/8290814
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值