关闭

C++ 01简单工厂模式

标签: 简单工厂模式C++
192人阅读 评论(0) 收藏 举报
分类:

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26767次
    • 积分:547
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:11篇
    • 译文:0篇
    • 评论:10条
    最新评论