抽象工厂模式

例子:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的;这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产液晶显示器电路板;工厂一直就这样运行着。有一天,总经理发现,直接生产显示器的其余部分也挺挣钱,所以,总经理决定,再建立两个工厂C和D;C负责生产非液晶显示器的其余部件,D负责生产液晶显示器的其余部件。此时,旁边参谋的人就说了,经理,这样做不好,我们可以直接在工厂A中添加一条负责生产非液晶显示器的其余部件的生产线,在工厂B中添加一条生产液晶显示器的其余部件的生产线,这样就可以不用增加厂房,只用将现有厂房进行扩大一下,同时也方便工厂的管理,而且生产非液晶显示器电路板的技术人员对非液晶显示的其余部件的生产具有指导的作用,生产液晶显示器电路板也是同理。总经理发现这是一个不错的主意。

      回到软件开发的过程中来,工厂A和B就C++设计模式——工厂方法模式;总经理再次建立工厂C和D,就是重复C++设计模式——工厂方法模式,只是生产的产品不同罢了。这样做的弊端就如参谋所说的那样,增加了管理成本和人力成本。在面向对象开发的过程中,是很注重对象管理和维护的,对象越多,就越难进行管理和维护;如果工厂数量过多,那么管理和维护的成本将大大增加;虽然生产的是不同的产品,但是可以二者之间是有微妙的关系的,如参谋所说,技术人员的一些技术经验是可以借鉴的,这就相当于同一个类中的不同对象,之间是可以公用某些资源的。那么,增加一条流水线,扩大厂房,当然是最好的主意了。

AbstractFactory的作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类


代码:
 //
// Created by siwen on 2017/10/13.
//

#include <iostream>
using namespace std;

//ProductA
class ProductA{

public:
    virtual void show() = 0 ;

};

class ProductA1 : public ProductA{

public:
    void show(){
            cout<<"I'm productA1" <<endl;
    }

};

class ProductA2 : public ProductA{

public:
    void show(){
        cout<<"I'm productA2"<<endl;
    }
};

//ProductB
class ProductB{

public:
    virtual void show() = 0 ;

};

class ProductB1 : public ProductB{

public:
    void show(){
        cout<<"I'm productB1" <<endl;
    }

};

class ProductB2 : public ProductB{

public:
    void show(){
        cout<<"I'm productB2"<<endl;
    }
};

//Factory
class Factory{
public:
    virtual ProductA* createProductA() = 0;
    virtual ProductB* createProductB() = 0;
};

class Factory1 : public Factory{
public:
    ProductA* createProductA()
    {
        return new ProductA1();
    }

    ProductB* createProductB(){

        return  new ProductB1();
    }
};

class Factory2 : public Factory{
public:
    ProductA* createProductA()
    {
        return new ProductA2();
    }

    ProductB* createProductB(){

        return new ProductB2();
    }
};

int main(int argc, char *argv[]){
    Factory *FactoryObj1 = new Factory1();
    Factory *FactoryObj2 = new Factory2();
    ProductA  *ProductAObj1 = FactoryObj1->createProductA();
    ProductA  *ProductAObj2 = FactoryObj2->createProductA();
    ProductB  *ProductBObj1 = FactoryObj1->createProductB();
    ProductB  *ProductBObj2 = FactoryObj2->createProductB();
    ProductAObj1->show();
    ProductAObj2->show();
    ProductBObj1->show();
    ProductBObj2->show();



}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值