下文是关于设计一个计算器的思路,本文采用了简单工厂模式设计计算器,定义一个工厂类,通过工厂类中的createOperate函数做逻辑判断,来调用具体的计算器类。直接看结构图,简单明了。
简单工厂模式结构图如下:
代码实现如下:
#include<iostream>
#include<string>
using namespace std;
//抽象运算类
class Operation
{
private:
double numberA = 0;
double numberB = 0;
public:
double getNumberA()
{
return numberA;
}
void setNumberA(double _numberA)
{
numberA = _numberA;
}
double getNumberB()
{
return numberB;
}
void setNumberB(double _numberB)
{
numberB = _numberB;
}
virtual double getResult() =0
{
double result = 0;
return result;
}
};
//加法类
class OperationAdd :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
};
//减法类
class OperationSub :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA()-getNumberB();
return result;
}
};
//乘法类
class OperationMul :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
};
//除法类
class OperationDiv :public Operation
{
public:
double getResult()
{
double result = 0;
if (this->getNumberB() == 0)
{
cout << "除数不能为0" << endl;
return 0;
}
result = getNumberA() / getNumberB();
return result;
}
};
//运算工厂类
class OperationFactory
{
public:
static Operation* createOperate(const char operate)
{
Operation * oper = 0;
switch (operate)
{
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
break;
case '*':
oper = new OperationMul();
break;
case '/':
oper = new OperationDiv();
break;
}
return oper;
}
};
//客户端代码
int main()
{
Operation *oper = 0;
oper = OperationFactory::createOperate('+');
oper->setNumberA(1);
oper->setNumberB(2);
double result = oper->getResult();
cout << result << endl;
return 0;
}
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
如果再扩展其他功能,需要添加具体类来继承抽象操作类,且要修改工厂类,这就违背了开放-封闭原则(修改了原有的类)。