【设计模式】抽象工厂

好久没写博客了,前端时间比较忙。
今天开始写创建型模式的demo。第一个模式是抽象工厂,也是圣经上第一个模式。当然也是比较简单的模式,该模式主要职责是将客户和具体的产品分离了。
将多个产品组装到同一个工厂下。客户只需要跟工厂打交道,而不需要知道产品具体的实现方式。
先写个demo,很简单,有一个抽象工厂,可以生产A/B两种产品。有两个具体的工厂,工厂1、2。他们都可以生产A/B两种产品,但是具体制造过程可能不一样。


/**
 * @file test_abstract_factory.cpp
 * @author itegel
 * @date 2013/09/10 19:44:32
 * @brief 
 *  
 **/

#include <iostream>
using namespace std;
class ItemA{
    public:
        ItemA(){
            cout<<"ItemA created!"<<endl;
        }
};

class ItemB{
    public:
        ItemB(){
            cout<<"ItemB created!"<<endl;
        }
};


class ItemA1:public ItemA{
public:
    ItemA1(){
        cout<<"ItemA1 created!"<<endl;
    }
};

class ItemA2:public ItemA{
public:
    ItemA2(){
        cout<<"ItemA2 created!"<<endl;
    }
};

class ItemB1:public ItemB{
public:
    ItemB1(){
        cout<<"ItemB1 created!"<<endl;
    }
};

class ItemB2:public ItemB{
public:
    ItemB2(){
        cout<<"ItemB2 created!"<<endl;
    }
};


class AbstractFactory{
public:
    AbstractFactory(){}
    virtual ItemA * CreateItemA() = 0;
    virtual ItemB * CreateItemB() = 0;                  
private:
    //int m_type;
};

class Factory1:public AbstractFactory{
public:
    Factory1(){}
    ItemA * CreateItemA(){
        return new ItemA1();
    }
    ItemB * CreateItemB(){
        return new ItemB1();
    }
};

class Factory2:public AbstractFactory{
public:
    Factory2(){}
    ItemA * CreateItemA(){
        return new ItemA2();
    }
    ItemB * CreateItemB(){
        return new ItemB2();
    }
};

int main(){
    AbstractFactory * factory;
    cout<<"factory 1 working...."<<endl;
    factory = new Factory1();
    factory->CreateItemA();
    factory->CreateItemB();
    delete factory;

    cout<<endl<<"factory 2 working...."<<endl;
    factory = new Factory2();
    factory->CreateItemA();
    factory->CreateItemB();
    delete factory;

    return 0;
}

输出如下:

factory 1 working....
ItemA created!
ItemA1 created!
ItemB created!
ItemB1 created!

factory 2 working....
ItemA created!
ItemA2 created!
ItemB created!
ItemB2 created!

抽象工厂的效果就是,客户端不需要关注具体产品的生产过程。客户可以灵活选择不同的工厂来生产具体的产品。比如,通过配置选择不同的UI风格。

缺点是想增加产品,代价很高,需要修改所有的工厂类。适合产品固定的场景。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值