大话设计模式(C++实现)--简单工厂模式

//设计模式很重要,最近在看,大话设计模式是java版本的,尝试看能不能用C++来实现

#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};

//1.封装
class Operation
{
public:
	static double GetResult(double numA,double numB,char operate);
protected:
private:
};
double Operation::GetResult(double numA,double numB,char operate)
{
	double result=0;
	switch(operate)
	{
	case '+':
		result=numA+numB;
		break;
	case '-':
		result=numA-numB;
		break;
	case  '*':
		result=numA*numB;
		break;
	case '/':
		if (abs(numB)<std::numeric_limits<double>::epsilon())
		{
			throw DerivedByZero();
		}
		result=numA/numB;
		break;
	default:
		break;
	}
	return result;
}

int main(int argc,char *argv[])
{
	cout<<"请输入数字A 操作符operate 数字B(ex:10.0 + 20.0)"<<endl;
	double numA,numB;
	char opearte;
	cin>>numA>>opearte>>numB;
	try
	{
		cout<<"运算结果为:"<<Operation::GetResult(numA,numB,opearte)<<endl;
	}
	catch(DerivedByZero&)
	{
		cerr<<"除数为0"<<endl;
	}
}
//问题:如果希望增加一个开根运算,则需要在switch里增加一个分支;问题是:你增加一个平方根
//运算却让加减乘除都参与编译,一不小心改错了,后果严重
//应该吧加减乘除分离,修改其中一个不影响其余几个,增加其他运算算法也不影响其他代码
//Solution:继承及多态
<pre name="code" class="cpp">#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};
class Operation
{
public:
	virtual double GetResult(){return 0;}//不能只声明
	double GetNumberA()
	{
		return numA;
	}
	double GetNumberB()
	{
		return numB;
	}
	void SetNumberA(double num)
	{
		numA=num;
	}
	void SetNumberB(double num)
	{
		numB=num;
	}
private:
	double numA;
	double numB;
	double result;
};

class OperationAdd:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()+GetNumberB();
	}
};

class OperationSub:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()-GetNumberB();
	}
};
class OperationMul:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()*GetNumberB();
	}
};
class OperationDiv:public Operation
{
public:
	double GetResult()
	{
		if (abs(GetNumberB())<std::numeric_limits<double>::epsilon())
		{
			throw DerivedByZero();
		}
		return GetNumberA()/GetNumberB();
	}
};

int main(int argc,char *argv[])
{
	OperationAdd add;
	OperationDiv div;
	try
	{
		add.SetNumberA(10.0);
		add.SetNumberB(20.0);
		div.SetNumberA(10.0);
		div.SetNumberB(0);
		cout<<add.GetResult()<<endl;
		cout<<div.GetResult()<<endl;
	}
	catch(DerivedByZero&)
	{
		cerr<<"除数为0"<<endl;
	}
}

//问题:如何让计算器知道希望选用的是哪一种算法,上面例子没有进行输入交互
//Solution:简单工厂模式


 
#include <iostream>
using namespace std;
class DerivedByZero
{
public:
protected:
private:
};
class Operation
{
public:
	virtual double GetResult(){return 0;}//不能只声明
	double GetNumberA()
	{
		return numA;
	}
	double GetNumberB()
	{
		return numB;
	}
	void SetNumberA(double num)
	{
		numA=num;
	}
	void SetNumberB(double num)
	{
		numB=num;
	}
private:
	double numA;
	double numB;
	double result;
};

class OperationAdd:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()+GetNumberB();
	}
};

class OperationSub:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()-GetNumberB();
	}
};
class OperationMul:public Operation
{
public:
	double GetResult()
	{
		return GetNumberA()*GetNumberB();
	}
};
class OperationDiv:public Operation
{
public:
	double GetResult()
	{
		if (abs(GetNumberB())<std::numeric_limits<double>::epsilon())
		{
			throw DerivedByZero();
		}
		return GetNumberA()/GetNumberB();
	}
};

//增加简单工厂类
class OperationFactory
{
public:
	static Operation* CreateOperate(char operate)
	{
		Operation *oper=NULL;
		switch(operate)
		{
		case '+':
			oper=new OperationAdd;
			break;
		case '-':
			oper=new OperationSub;
			break;
		case  '*':
			oper=new OperationMul;
			break;
		case '/':
			oper=new OperationDiv;
			break;
		default:
			break;
		}
		return oper;
	}
};
int main(int argc,char *argv[])
{
	cout<<"请输入数字A 操作符operate 数字B(ex:10.0 + 20.0)"<<endl;
	double numA,numB;
	char opearte;
	Operation *oper;
	cin>>numA>>opearte>>numB;
	try
	{
		oper=OperationFactory::CreateOperate(opearte);
		oper->SetNumberA(numA);
		oper->SetNumberB(numB);
		cout<<"运算结果为:"<<oper->GetResult()<<endl;
	}
	catch(DerivedByZero&)
	{
		cerr<<"除数为0"<<endl;
	}
	delete oper;
}
//分析:如果要增加各种复杂的运算,需要增加相应的子类和修改运算类工厂,在switch增加分支

VS自动生成的UML图



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值