简单工厂模式

2019-02-26  本文已影响0人  欧德朗

2019-02-26
前面也说了:
在我看来这个简单工厂模式,主要针对方向就可扩展性。
要求是实现一个简单的计算器。
为了隐藏实现细节,将运算细节单独封装,使用了封装特性。
为了代码复, 建造一个运算父类,几个运算子类继承与运算父类,使用继承特性。
为了代码得可扩展性,创建一个工厂类去实例化运算子类的对象,使用了多态特性。
具体代码如下:

#include<iostream>
using namespace std;

class Operation
{
private:
    /* data */
public:

    Operation(/* args */){
        cout << "Operation 构造" << endl;
    };
    double num_1 ;
    double num_2 ;
    virtual double GetResult(double num_1,double num_2) = 0;
    ~Operation()
    {
        cout << "Operation  析构" << endl;
    }
};

class OperationAdd :public Operation
{
private:
    /* data */
public:
    OperationAdd(/* args */){
        cout << "OperationAdd 构造" << endl;
    };
    double GetResult(double num_1,double num_2){
        cout << num_1 << " " << num_2 <<endl;   
        return (num_1 + num_2);
    }
};

class OperationSub : public Operation
{
private:
    /* data */
public:
    OperationSub(/* args */){
        cout << "OperationSub 构造" << endl;
    };
    double GetResult(double num_1,double num_2){
        cout << num_1 << " " << num_2 <<endl;
        return (num_1 - num_2);
    }
};

class Factory
{
private:
    /* data */
public:
    Factory(/* args */){
        cout << "Factory 构造" << endl;
    };
    Operation* create_Operat(string operat)
    {
        //根据传入的运算符不同,实例化不同的运算子类
        Operation* oper = NULL;
        if("+" == operat)
        oper = new OperationAdd();
        if("-" == operat)
        oper = new OperationSub();
        //将子类对象return 出去。
        return oper;
    }
    ~Factory(){
        cout << "Factory 析构" << endl; 
    }
};

int main()
{
    double num_1 ;
    double num_2 ;
    string operat;
    cout << "请输入第一个数字" << endl;
    cin >> num_1 ;
    cout << "请输入运算符 " << endl; 
    cin >> operat;
    cout << "请输入第二个数字" << endl;
    cin >> num_2 ;
    
    Factory * fa = new Factory();
    //实例化一个工厂类的对象,用工厂类的对象的create_Operat方法实例化几个运算子类的对象,
    Operation * op =  fa->create_Operat(operat);
    //父类指针指向子类对象,调用子类实现。
    double result = op->GetResult(num_1, num_2);
    cout << num_1 << " "  << operat << " " << num_2 << " = " << result << endl;
    delete fa;
    delete op;
    return 0;
}

coding 过程中遇到的问题:

Operation.cpp:(.text._ZN7Factory13create_OperatESs[_ZN7Factory13create_OperatESs]+0x41): undefined reference to `OperationAdd::OperationAdd()'
Operation.cpp:(.text._ZN7Factory13create_OperatESs[_ZN7Factory13create_OperatESs]+0x6f): undefined reference to `OperationSub::OperationSub()'

说的是构造函数没有实现的问题,需要给构造函数加入实现。

可扩展性:

在二进制做成脚本中使用了同样的设计模式,就是根据BUILD_STATIC或者是BUILD_SHAREAD来决定我们到底使用哪一个action进行处理。

如果我们想要加入别的运算符号的处理,只需要添加运算子类和添加工厂类中的case选项即可,只需要扩展,不需要修改。

类图如下:
简单工厂模式类图
上一篇下一篇

猜你喜欢

热点阅读