使用简单工厂模式实现四则运算 C++

81 篇文章 0 订阅
29 篇文章 1 订阅

今天实现了一个简单工厂模式, 实现四则运算。
说下对简单工厂的理解, 个人感觉他就是利用一个工厂类的静态函数获取一个工厂产品的实例, 在C++中表现就是 获取一个指向产品的派生类的基类指针, 利用多态 实现具体产品类的调用。
ie, 利用工厂类负责创建对象的实例
下面这是我们所绘制的C++的UML类图
这里写图片描述

代码实现:
operation.h

#ifndef _OPERATION_H_
#define _OPERATION_H_

template<class T>
class COperation
{
public:
    COperation(){}
    COperation(T a, T b) :numberA(a), numberB(b){}

    /************************************************************************/
    /* 私有数据的访问方法                                                   */
    /************************************************************************/
    T getNumA() const{ return numberA; }
    T getNumB() const{ return numberB; }
    void setNumA(const T & a){ numberA = a; }
    void setNumB(const T & b){ numberB = b; }

    /************************************************************************/
    /* 获取计算结果                                                         */
    /************************************************************************/
    virtual T getResult() const = 0;

private:
    T numberA;
    T numberB;  
};

#endif // !_OPERATION_H_

MainOperation.h

#ifndef _MAINOPERATION_H_
#define _MAINOPERATION_H_

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

/************************************************************************/
/* 加法运算类                                                           */
/************************************************************************/
template<class T>
class CAddOperation : public COperation<T>{
public:
    CAddOperation(){}
    CAddOperation(T a, T b) : COperation(a, b){}

    T getResult() const{
        return getNumA() + getNumB();
    }
};

/************************************************************************/
/* 减法运算类                                                           */
/************************************************************************/
template<class T>
class CSubOperation : public COperation<T>{
public:
    CSubOperation(){};
    CSubOperation(T a, T b) : COperation(a, b){}

    T getResult() const {
        return getNumA() - getNumB();
    }
};

/************************************************************************/
/* 乘法运算类                                                           */
/************************************************************************/
template<class T>
class CMulOperation : public COperation<T>{
public:
    CMulOperation(){};
    CMulOperation(T a, T b) : COperation(a, b){}

    T getResult() const {
        return getNumA() * getNumB();
    }
};

/************************************************************************/
/* 除法运算类                                                           */
/************************************************************************/
template<class T>
class CDivOperation : public COperation<T>{
public:
    CDivOperation(){};
    CDivOperation(T a, T b) : COperation(a, b){}

    T getResult() const {
        T b = getNumB();
        if (b < 1e-6 && b > 1e-6){
            std::cerr << "divsion by zero" << std::endl;
            return 0;
        }
        return getNumA() / getNumB();
    }
};

#endif // _MAINOPERATION_H_

OperFactory.h

#ifndef _OPERFACTORY_H_
#define _OPERFACTORY_H_

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

template <class T>
class COperFactory{
public:
    /************************************************************************/
    /* 对外提供一个创建运算操作的工厂函数接口                               */
    /************************************************************************/
    static std::shared_ptr<COperation<T>> createOperation(char oper){
        COperation<T> * ptr = nullptr;
        switch (oper)
        {
            case '+':
                ptr = new CAddOperation<T>();
                break;
            case '-':
                ptr = new CSubOperation<T>();
                break;
            case '*':
                ptr = new CMulOperation<T>();
                break;
            case '/':
                ptr = new CDivOperation<T>();
                break;
            default:
                ptr = nullptr;
                break;
        }

        return std::shared_ptr<COperation<T>>(ptr);
    }
};


#endif // _OPERFACTORY_H_

main.h

#include "OperFactory.h"
#include <iostream>

using namespace std;

/************************************************************************/
/* 借助简单工厂模式, 实现 两个数字的加减乘除四则运算操作               */
/************************************************************************/

int main(){
    shared_ptr<COperation<double>> oper = COperFactory<double>::createOperation('/');
    oper->setNumA(3.0);
    oper->setNumB(4.0);
    cout << oper->getResult() << endl;

    system("pause");
    return 0;
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但是由工厂类决定要实例化的类是哪一个。在简单工厂模式中,我们创建一个工厂类,根据传入的参数来决定创建哪一类产品的实例。 下面是一个简单的四则运算的例子: 首先,我们定义一个抽象基类 `Operation`,用于表示所有四则运算的基本操作: ```cpp class Operation { public: virtual double getResult() = 0; double m_numberA; double m_numberB; }; ``` 然后,我们定义加法、减法、乘法、除法等具体的操作类,它们都继承自 `Operation` 并实现 `getResult()` 函数: ```cpp class AddOperation : public Operation { public: double getResult() { return m_numberA + m_numberB; } }; class SubOperation : public Operation { public: double getResult() { return m_numberA - m_numberB; } }; class MulOperation : public Operation { public: double getResult() { return m_numberA * m_numberB; } }; class DivOperation : public Operation { public: double getResult() { if (m_numberB == 0) { throw "除数不能为0"; } return m_numberA / m_numberB; } }; ``` 接下来,我们定义一个工厂类 `OperationFactory`,它根据传入的参数来创建相应的操作实例: ```cpp class OperationFactory { public: static Operation* createOperation(char operate) { Operation* operation = nullptr; switch (operate) { case '+': operation = new AddOperation(); break; case '-': operation = new SubOperation(); break; case '*': operation = new MulOperation(); break; case '/': operation = new DivOperation(); break; } return operation; } }; ``` 最后,我们可以使用如下代码来进行测试: ```cpp int main() { double a = 10.0, b = 5.0; char operate = '+'; Operation* operation = OperationFactory::createOperation(operate); operation->m_numberA = a; operation->m_numberB = b; double result = operation->getResult(); cout << a << operate << b << "=" << result << endl; delete operation; return 0; } ``` 输出结果为: ``` 10+5=15 ``` 这就是简单工厂模式的基本思路和实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值