C++ 简单工厂模式 与 工厂模式

文章介绍了C++中两种工厂模式的实现:简单工厂模式和工厂方法模式。简单工厂模式用于创建不同类型的运算符类(如加法和减法),但违反了开放封闭原则。工厂方法模式则通过工厂基类和具体工厂类解决了这一问题,增加了新的产品类时无需修改原有代码,遵循开放封闭原则。
摘要由CSDN通过智能技术生成

简单工厂模式:

一个工厂,多个产品。产品需要有一个虚基类。通过传入参数,生成具体产品对象,并利用基类指针指向此对象。通过工厂获取此虚基类指针,通过运行时多态,调用子类实现。

注意:简单工厂 的设计是违反开放封闭原则(对扩展是开放的、对修改是封闭的)的,因为当我们新增一个产品,简单工厂类内部需要修改逻辑以生产对应的产品类。

#include <iostream>
using namespace std;

//操作类型
typedef enum OPERATIONTYPE
{
    OPERATION_ADD,
    OPERATION_SUB,
}OPERATIONTYPE;

//运算符类
class operation
{
public:
    int a;
    int b;
public:
    operation(/* args */){}
    virtual ~operation(){}
public:
    virtual int getResult() = 0;
};

//加法类
class operationAdd : public operation
{
public:
    operationAdd(/* args */){}
    ~operationAdd(){}
public:
     int getResult()
     {
        return a+b;
     }
};

//减法类
class operationSub : public operation
{
public:
    operationSub(/* args */){}
    ~operationSub(){}
public:
    int getResult()
    {
        return a-b;
    }
};

//简单工厂类
class operationFactory
{
public:
    operationFactory(/* args */){}
    ~operationFactory(){}
public:
    operation* createOperation(OPERATIONTYPE type)
    {
        operation *oper;
        switch (type)
        {
        case OPERATION_ADD:
            oper = new operationAdd();
            break;
        case OPERATION_SUB:
            oper = new operationSub();
            break;
        default:
            oper = nullptr;
            break;
        }

        return oper;
    }
};

//客户端
int main()
{
    //创建工厂
    operationFactory opeFactory;

    //通过工厂生产操作类
    operation *opeAdd = opeFactory.createOperation(OPERATION_ADD);
    operation *opeSub = opeFactory.createOperation(OPERATION_SUB);

    opeAdd->a = 1;
    opeAdd->b = 2;
    cout<<"add result: "<<opeAdd->getResult()<<endl;

    opeSub->a = 3;
    opeSub->b = 4;
    cout<<"sub result:" <<opeSub->getResult()<<endl;

    //销毁对象
    delete opeAdd;
    opeAdd = nullptr;

    delete opeSub;
    opeSub = nullptr;

    return 0;
}

工厂模式:

多个工厂,多个产品,每个产品对应于一个工厂。此时工厂和产品都是通过虚基类的方式构建。当增加一个新产品时,同时增加一个新工厂。增加新工厂属于扩展,不会修改以前工厂类和产品类的任何代码。可以看出多个独立的简单工厂模式构成了工厂方法模式,工厂模式是在开放封闭原则的基础上针对简单工厂的升级。

#include <iostream>
using namespace std;

//运算符类
class operation
{
public:
    int a;
    int b;
public:
    operation(/* args */){}
    virtual ~operation(){}
public:
    virtual int getResult() = 0;
};

//加法类
class operationAdd : public operation
{
public:
    operationAdd(/* args */){}
    ~operationAdd(){}
public:
     int getResult()
     {
        return a+b;
     }
};

//减法类
class operationSub : public operation
{
public:
    operationSub(/* args */){}
    ~operationSub(){}
public:
    int getResult()
    {
        return a-b;
    }
};

//工厂基类
class factory
{
public:
    factory(/* args */){}
    virtual ~factory(){}
public:
    virtual operation *createOperation() = 0;
};

//加法工厂类
class addFactory : public factory
{
public:
    addFactory(/* args */){}
    ~addFactory(){}
public:
    operation *createOperation()
    {
        return new operationAdd();
    }
};

//减法工厂类
class subFactory : public factory
{
public:
    subFactory(/* args */){}
    ~subFactory(){}
public:
    operation *createOperation()
    {
        return new operationSub();
    }
};

//客户端
int main()

    //创建运算符类工厂
    factory *addFac = new addFactory();
    factory *subFac = new subFactory();

  

    //通过运算符类工厂生产对应运算符类
    operation *addOpe = addFac->createOperation();    
    operation *subOpe = subFac->createOperation();  

    //使用运算符类
    addOpe->a = 1;
    addOpe->b = 2;

    subOpe->a = 3;
    subOpe->b = 4;

    cout<< "add result: " << addOpe->getResult() <<endl;
    cout<< "sub result: " << subOpe->getResult() <<endl; 

    //销毁对象
    delete addOpe;
    addOpe = nullptr;

    delete subOpe;
    subOpe = nullptr;

    delete addFac;
    addFac = nullptr;

    delete subFac;
    subFac = nullptr;


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁盒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值