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

简单工厂模式:

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

C++ 简单工厂模式 与 工厂模式_第1张图片

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

#include 
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: "<getResult()<a = 3;
    opeSub->b = 4;
    cout<<"sub result:" <getResult()<

工厂模式:

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

C++ 简单工厂模式 与 工厂模式_第2张图片

#include
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() <     cout<< "sub result: " << subOpe->getResult() <

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

    delete subOpe;
    subOpe = nullptr;

    delete addFac;
    addFac = nullptr;

    delete subFac;
    subFac = nullptr;


    return 0;
}

你可能感兴趣的:(设计模式,c++,设计模式)