抽象工厂模式AbstractFactory(c++设计模式)

面试官:请你谈谈抽象工厂模式

  • 简单工厂模式 说起,简单工厂模式通过设置工厂来模板化了大部分重复的创建产品代码,工厂通过参数来创建不同的产品。
  • 由于这些参数得事先定义好,也就是说这工厂只能生产某些产品,如果我希望添加或者删除产品,需要对工厂进行修改,违背了 开闭原则,从而引入了 工厂方法模式 ,通过添加抽象工厂,每个工厂负责一种产品的创建,但这样工厂类会特别多,增加了系统开销。
  • 所以就有了抽象工厂模式,抽象工厂模式里每个工厂负责一个产品族的创建,也就是引入了抽象产品跟抽象工厂的结合。

抽象工厂模式的开闭原则倾斜性

对于新增产品族,相当于新增了一个生产产品的商家,此时符合开闭原则;
但对于新增产品等级结构时,也就是新增产品时,此时不符合开闭原则。

抽象工厂模式代码

/*
 * @ Description: C++ Design Patterns___Abstract Factory
 * @ version: v1.0
 * @ Author: WeissxJ
 */

#include<iostream>
class ProductA                  //抽象产品A
{
    public:
        virtual ~ProductA() {}
        virtual const char * getName()=0;
        // ...
};

class ConcreteProductAX : public ProductA   //具体产品X
{
    public:
        ~ConcreteProductAX() {}
        const char* getName(){
            return "A->X";
        }
        // ...
};

class ConcreteProductAY : public ProductA   //具体产品Y
{
    public:
        ~ConcreteProductAY() {}
        const char* getName(){
            return "A->Y";
        }
        // ...
};

class ProductB
{
    public:
        virtual ~ProductB() {}
        virtual const char * getName()=0;
        // ...
};

class ConcreteProductBX : public ProductB
{
    public:
        ~ConcreteProductBX() {}
        const char* getName(){
            return "B->X";
        }
        // ...
};

class ConcreteProductBY : public ProductB
{
    public:
        ~ConcreteProductBY() {}
        const char* getName(){
            return "B->Y";
        }
        // ...
};

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

class ConcreteFactoryX : public AbstractFactory
{
    public:
        ~ConcreteFactoryX() {}
        ProductA *createProductA(){
            return new ConcreteProductAX();
        }
        ProductB *createProductB(){
            return new ConcreteProductBX();
        }
        // ...
};

class ConcreteFactoryY : public AbstractFactory
{
    public:
        ~ConcreteFactoryY() {}
        ProductA *createProductA(){
            return new ConcreteProductAY();
        }
        ProductB *createProductB(){
            return new ConcreteProductBY();
        }
        // ...
};

int main(){
    ConcreteFactoryX *factoryX = new ConcreteFactoryX();
    ConcreteFactoryY *factoryY = new ConcreteFactoryY();

    ProductA *p1 = factoryX->createProductA();
    std::cout << "Product: " << p1->getName() << std::endl;
  
    ProductA *p2 = factoryY->createProductA();
    std::cout << "Product: " << p2->getName() << std::endl;
  
    delete p1;
    delete p2;
    
    delete factoryX;
    delete factoryY;
  
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值