#include<exception>
#include <iostream>
using namespace std;
//1-简单工厂模式:实现计算器
class Operator
{
public:
Operator(double iVal1, double iVal2) :m_val1(iVal1), m_val2(iVal2){};
virtual double getResult() = 0;
virtual ~Operator(){};
protected:
double m_val1;
double m_val2;
};
class OperatorAdd :public Operator
{
public:
OperatorAdd(double iVal1, double iVal2) :Operator(iVal1,iVal2){};
double getResult() override
{
return m_val1 + m_val2;
}
};
class OperatorSub :public Operator
{
public:
OperatorSub(double iVal1, double iVal2) :Operator(iVal1, iVal2){};
double getResult() override
{
return m_val1 - m_val2;
}
};
class OperatorMuti :public Operator
{
public:
OperatorMuti(double iVal1, double iVal2) :Operator(iVal1, iVal2){};
double getResult() override
{
return m_val1 * m_val2;
}
};
class OperatorDev :public Operator
{
public:
OperatorDev(double iVal1, double iVal2) :Operator(iVal1, iVal2){};
double getResult() override
{
if (m_val2==0)
{
cout << "除数不能为0!" << endl;
throw exception("除数不能为0!");
}
return m_val1 / m_val2;
}
};
class OperatorFactory
{
public:
static Operator *createOperator(double iVal1,char c,double iVal2)
{
switch (c)
{
case '+':
{
return new OperatorAdd(iVal1, iVal2);
}
case '-':
{
return new OperatorSub(iVal1, iVal2);
}
case '*':
{
return new OperatorMuti(iVal1, iVal2);
}
case '/':
{
return new OperatorDev(iVal1, iVal2);
}
default:
{
cout<<"运算符非法!"<<endl;
throw exception("运算符非法!");
}
}
}
static void destoryOperator(Operator *&ipOper)
{
delete ipOper;
ipOper = NULL;
}
};
int main()
{
Operator *pOper = OperatorFactory::createOperator(10.23, '+', -9.87);
cout << pOper->getResult() << endl;
OperatorFactory::destoryOperator(pOper);
system("pause");
}