简单工厂模式的c++版本

研究了一下大话设计模式,顺手吧简单工厂模式的c++版本写出来了,放上来分享一下

/*简单工厂模式
*by [email protected] 2017年7月11日
*/
#include 
#include 
using namespace std;
//基础操作类,加法类,减法类,乘法类,除法类的父类
class Operation
{
public:
    double get_num_a(){return _number_a;}
    double get_num_b(){return _number_b;}
    void set_num_a(double a){_number_a = a;}
    void set_num_b(double b){_number_b = b;}
    //虚函数
    virtual double GetResult()
    {
        double result = 0;
        return result;
    }
private:
    double _number_a;
    double _number_b;

};

//加法类
class OperationAdd:public Operation
{
public:
    //重写虚函数GetResult
    double GetResult() override
    {
        double result = get_num_a() + get_num_b();
        return result;
    }
};

//减法类
class OperationSub:public Operation
{
public:
    //重写虚函数GetResult
    double GetResult() override
    {
        double result = get_num_a() - get_num_b();
        return result;
    }
};

//乘法类
class OperationMul:public Operation
{
public:
    //重写虚函数GetResult
    double GetResult() override
    {
        double result = get_num_a() * get_num_b();
        return result;
    }

};

class OperationDiv:public Operation
{
public:
    //重写虚函数GetResult
    double GetResult() override
    {
        if(0 == get_num_b())
        {
            //除数不能为0
            return -1;
        }
        double result = get_num_a() / get_num_b();
        return result;
    }
};

//工厂类,根据运算符的不同创造不同的实例
class OperationFactory
{
public:
    //将运算符转换成switch可以识别的int类型
    int transform(string oper)
    {
        if("+" == oper)
        {
            return 0;
        }else if("-" == oper)
        {
            return 1;
        }else if("*" == oper)
        {
            return 2;
        }else
        {
            return 3;
        }
    }
    //创建实例函数,根据操作符返回相应的操作Operation类的指针
    Operation *createOperate(string operate)
    {
        Operation *oper;
        switch(transform(operate))
        {
            case 0:
                oper = new OperationAdd();
                break;
            case 1:
                oper = new OperationSub();
                break;
            case 2:
                oper = new OperationMul();
                break;
            case 3:
                oper = new OperationDiv();
                break;
        }
        return oper;
    }
};

int main()
{
    //创建一个运算类的指针
    Operation *oper;
    //创建一个工厂类的实例
    OperationFactory create;
    //接受工厂类返回的不同操作类的地址
    oper = create.createOperate("+");
    //设置两个数
    oper->set_num_a(9.154);
    oper->set_num_b(11.3);
    //完成运算
    double result = oper->GetResult();
    cout<<"9.154+11.3="<return 0;
}

结果输出

$ g++ factory.cpp -std=c++11 
$ ./a.out 
9.154+11.3=20.454

工厂模式的优缺点(摘自《设计模式》):
优点:
1.它分离了具体的类,将客户与类的实现分离.产品类名也在具体的工厂的实现中被分离;它们不会出现在客户代码中.
2.它使得易于交换产品系列.一个具体的工厂类在应用中仅出现一次即它初始化的时候.这使得改变一个类变得很容易.
3.有利于产品的一致性.当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要.
缺点:
1.难以支持新种类产品.难以扩展抽象工厂以生产新种类的产品.因为工厂类的接口确定了可以被创建的产品集合.支持新种类的产品就需要扩充该工厂的接口.这将设计工厂类及其所有子类的改变.

转载请注明出处:http://blog.csdn.net/clh01s/article/details/74991526

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