工厂方法模式实现四则运算 C++

说下对工厂方法模式的理解:
工厂方法模式定义了一个用来创建对象的接口, 他让子类决定实例化哪个对象, 他使得一个类的实例化延迟到其子类
简单工厂模式最大的优点是在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类, 对客户端来说去除了与具体产品的依赖。 但是他一定程度上违背了开闭原则, 对扩展开放的同时, 对修改也开放了。
采用工厂方法模式, 可以根据依赖倒转原则, 将工厂基类, 设置为一个虚基类, 后面当需要增加功能的时候, 只需要添加相应功能的运算类和工厂类就可以了, 实现接口的统一。
另外, 需要说明的是, 工厂方法模式, 实际上是将简单工厂模式中工厂类中的简单的逻辑判断移到了客户端的代码中去。
他克服了简单工厂违背开闭原则的缺点, 同时又保持了封装对象创建过程的优点。他也有缺点, 就是需要增加一个产品类的同时增加一个产品工厂。

UML图
图绘制的不好, 理解大体意思就好
工厂方法模式实现四则运算 C++_第1张图片

代码:
operation.h

#ifndef _OPERATION_H_
#define _OPERATION_H_

/************************************************************************/
/* 产品类 */
/************************************************************************/
class CIOperation{
public:
    double NumA() const { return numA; }
    void NumA(double val) { numA = val; }
    double NumB() const { return numB; }
    void NumB(double val) { numB = val; }

    // operations
    virtual double getResult() const = 0;

private:
    double numA;    
    double numB;    
};

#endif // _OPERATION_H_

MainOperation.h

#ifndef _MAINOPERATION_H_
#define _MAINOPERATION_H_

#include "Operation.h"
#include <cmath>

/************************************************************************/
/* 加法操作 */
/************************************************************************/
class CAddOperation : public CIOperation{
public:
 double getResult() const override{
 return NumA() + NumB();
 }
};

/************************************************************************/
/* 减法操作 */
/************************************************************************/
class CSubOperation : public CIOperation{
public:
 double getResult() const override{
 return NumA() - NumB();
 }
};

/************************************************************************/
/* 乘法操作 */
/************************************************************************/
class CMulOperation : public CIOperation{
public:
 double getResult() const override{
 return NumA() * NumB();
 }
};

/************************************************************************/
/* 除法操作 , 注意除零问题 */
/************************************************************************/
class CDivOperation : public CIOperation{
public:
 double getResult() const override{
 if (std::fabs(NumB()) < 1e-6)
 return NumA() / (NumB() + 1e-6);
 return NumA() / NumB();
 }
};


#endif // _MAINOPERATION_H_

Factory.h

#ifndef _FACTORY_H_
#define _FACTORY_H_

#include "MainOperation.h"
#include <memory>

/************************************************************************/
/* 抽象工厂 */
/************************************************************************/
class CIFactory{
public:
 virtual std::shared_ptr<CIOperation> getOperation() = 0;
};

/************************************************************************/
/* 加法工厂 */
/************************************************************************/
class CAddFactory : public CIFactory{
public:
 std::shared_ptr<CIOperation> getOperation(){
 return std::shared_ptr<CIOperation>(new CAddOperation());
 }
};

/************************************************************************/
/* 减法工厂 */
/************************************************************************/
class CSubFactory : public CIFactory{
public:
 std::shared_ptr<CIOperation> getOperation(){
 return std::shared_ptr<CIOperation>(new CSubOperation());
 }
};

/************************************************************************/
/* 乘法工厂 */
/************************************************************************/
class CMulFactory : public CIFactory{
public:
 std::shared_ptr<CIOperation> getOperation(){
 return std::shared_ptr<CIOperation>(new CMulOperation());
 }
};

/************************************************************************/
/* 除法工厂 */
/************************************************************************/
class CDivFactory : public CIFactory{
public:
 std::shared_ptr<CIOperation> getOperation(){
 return std::shared_ptr<CIOperation>(new CDivOperation());
 }
};

#endif // _FACTORY_H_

main.cpp

#include "MainOperation.h"
#include "Factory.h"

#include <iostream>

using namespace std;

int main(){
    shared_ptr<CIFactory> operFactory(new CAddFactory);
    shared_ptr<CIOperation> oper = operFactory->getOperation();
    oper->NumA(3.0);
    oper->NumB(5.0);
    cout << oper->getResult() << endl;

    system("pause");
    return 0;
}

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