大话设计模式——工厂方法模式(C++计算器修改)

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是 简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
下面的代码是在前面简单工厂模式上修改的,可以参考一下区别,代码里面有注释。

//
//  main.cpp
//  Factory
//
//  Created by Ben_22 on 14-5-28.
//  Copyright (c) 2014年 Ben_22. All rights reserved.
//

#include <iostream>
#include "string"
using namespace::std;


class Operation{
public:
    double _numberA = 0;
    double _numberB = 0;
public:
    virtual double getResult()=0;
};

class OperationAdd : public Operation{
public:
    double getResult() override{
        return _numberA+_numberB;
    }
};

class OperationSub : public Operation{
public:
    double getResult() override{
        return _numberA-_numberB;
    }
};

class OperationMul : public Operation{
public:
    double getResult() override{
        return _numberA*_numberB;
    }
};

class OperationDiv : public Operation{
public:
    double getResult() override{
        if (_numberB==0) {
            printf("异常\n");
            return 0;
        }
        return _numberA/_numberB;
    }
};

/*下面为简单工厂模式*/
/*违背了开闭原则
 *每次新加运算都要在OperationFactory类添加case修改类。
 */
class OperationFactory{
public:
    static Operation* createOpr(char operate){
        Operation *oper = nullptr;
        switch (operate) {
            case '+':
                oper = new OperationAdd;
                break;
            case '-':
                oper = new OperationSub;
                break;
            case '*':
                oper = new OperationMul;
                break;
            case '\\':
                oper = new OperationDiv;
                break;
            default:
                break;
        }
        return oper;
    };
};

/*下面为工厂方法模式*/
/*工厂方法对简单工厂做了进一步抽象, 多了一个Factory类,这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
 */
class Factory{
public :
    Operation createOpr();
};

class FactoryAdd : public Factory{
public:
    Operation *createOpr(){
        return new OperationAdd();
    }
};
class FactorySub : public Factory{
public:
    Operation *createOpr(){
        return new OperationSub();
    }
};
class FactoryMul : public Factory{
public:
    Operation *createOpr(){
        return new OperationMul();
    }
};
class FactoryDiv : public Factory{
public:
    Operation *createOpr(){
        return new OperationDiv();
    }
};



int main(int argc, const char * argv[])
{
    int num1 = 5, num2 = 9;
    
    //简单工厂模式
    Operation *temp1 = OperationFactory::createOpr('+');
    temp1->_numberA = num1;
    temp1->_numberB = num2;
    cout<<"和"<<temp1->getResult()<<endl;

    
    //工厂方法模式
    Operation *tempA = (new FactoryAdd())->createOpr();
    tempA->_numberA = num1;
    tempA->_numberB = num2;
    cout<<"和"<<tempA->getResult()<<endl;
    
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值