C++ 01简单工厂模式

下文是关于设计一个计算器的思路,本文采用了简单工厂模式设计计算器,定义一个工厂类,通过工厂类中的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;
}
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

如果再扩展其他功能,需要添加具体类来继承抽象操作类,且要修改工厂类,这就违背了开放-封闭原则(修改了原有的类)。

阅读更多
文章标签: 简单工厂模式 C++
个人分类: C++设计模式
上一篇C++ 09原型模式
下一篇C++ 08工厂方法模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭