简单工厂模式

     这些天开始看设计模式这本书,起初对于设计模式是陌生的更加不知其有什么作用,但看了第一章后就已经让我受益匪浅了,让我对代码的编写有了新的认识,不再是枯燥乏味,而更多的是一门艺术的体现。

现在倘若让你利用C++,Java,C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得出结果。我相信这对绝大多数有编程语言底子的人来说不是问题。一个main函数,在终端显示输入数字和运算符,并对输入的运算符进行if或者switch判断,来得出运算后的结果。

没错程序到这里就编写完了,功能也是完全符合要求,但这往往不是出题人想要的答案。这样的代码本身没有错,但是没有任何吸睛的地方,站在计算器的角度上,为了实现而实现,程序不容易维护,不容易扩展,不容易复用,从而达不到高质量代码的要求。因此我们需要对代码进行改进,要用面向对象的方法去实现,通过封装,继承,多态把程序的耦合度降低,彼此之间互不影响,使得程序更加的灵活,容易修改,并且易于复用。具体到本题的计算器例子中来,将计算和显示分开来,我们可以创建一个算法类,一个工厂类(用来new出不同的运算类),四种运算符号类派生于算法类,工厂类根据终端不同符号而生产出不同的符号类,再利用多态的方式获得不同符号类所计算出的结果。如果这个时候想添加一种新的运算方式(比如求根号),只需要在算法类中派生出一个根号子类,同时在工厂类中添加一个新的 选项就好了,别的运算方式完全触及不到,若要进行修改也只要对目标类进行操作就行,可以说这样的代码才符合出题人的要求,因而,考虑全面,将代码视作一门艺术来写,会让你收获良多,下面是自己写的本题计算器代码:

#include <iostream>
using namespace std;

class Operation      //定义一个算法类(作为基类)
{
private:
	double NumberA ;    //操作数 NumberA
	double NumberB ;    //操作数 NumberB

public:
	void SetNumberA(double A){ NumberA = A ;}    //给操作数A赋值
	void SetNumberB(double B){ NumberB = B ;}    //给操作数B赋值
	double GetNumberA(){ return NumberA ;}   //获取操作数A的值
	double GetNumberB(){ return NumberB ;}   //获取操作数B的值
	virtual double GetResult()   //虚函数GetResult() 利用多态实现派生类的GetResult()函数
	{
		double dblresult ;
		return dblresult ;
	}
};

class OperationAdd : public Operation   //加法算法类
{
	double GetResult()
	{
		double dblresult ;
		double NumberA ;   
		double NumberB ;
		NumberA = this->GetNumberA() ;
		NumberB = this->GetNumberB() ;
		dblresult = NumberA + NumberB ;
		return dblresult ;
	}
};

class OperationSUB : public Operation  //减法算法类
{
	double GetResult()
	{
		double dblresult ;
		double NumberA ;   
		double NumberB ;
		NumberA = this->GetNumberA() ;
		NumberB = this->GetNumberB() ;
		dblresult = NumberA - NumberB ;
		return dblresult ;
	}
};

class OperationMUL : public Operation  //乘法算法类
{
	double GetResult()
	{
		double dblresult ;
		double NumberA ;   
		double NumberB ;
		NumberA = this->GetNumberA() ;
		NumberB = this->GetNumberB() ;
		dblresult = NumberA * NumberB ;
		return dblresult ;
	}
};

class OperationDIV : public Operation  //除法算法类
{
	double GetResult()
	{
		double dblresult ;
		double NumberA ;   
		double NumberB ;
		NumberA = this->GetNumberA() ;
		NumberB = this->GetNumberB() ;
		try
		{
			if(NumberB == 0)
			{
				throw"对不起,除数不能为为0 !" ;
			}
			else
			{
				dblresult = NumberA / NumberB ;
				return dblresult ;
			}
		}
		catch (const char * message)
		{
			cout<<message<<endl ;
		}
		
	}
};

class OperationFactory     //工厂类,用于生成算法类
{
private:
	Operation * pOperation ;    //声明一个算法类的指针

public:
	Operation * createOperation(char m_operate)  //根据运算符生成不同的算法类
	{
		switch(m_operate)
		{
		case '+' :
			{
				pOperation = new OperationAdd ;
				break; 
			}
		case '-' :
			{
				pOperation = new OperationSUB ;
				break;
			}
		case '*' :
			{
				pOperation = new OperationMUL ;
				break;
			}
		case '/' :
			{
				pOperation = new OperationDIV ;
				break;
			}
		}
		return pOperation ;
	}
};

int main()
{

	double NumberA,NumberB ;
	char btoperate ;
	OperationFactory objOperationFactory ;
	try
	{
		cout<<"请输入数字A :";
		cin>>NumberA ;
		cout<<"请输入运算符(+、-、*、/) :";
		cin>>btoperate ;
		cout<<"请输入数字B :";
		cin>>NumberB ;

		Operation * pOperation = objOperationFactory.createOperation(btoperate) ;
		pOperation->SetNumberA(NumberA) ;
		pOperation->SetNumberB(NumberB) ;

		cout<<"计算结果为:"<<pOperation->GetResult()<<endl ;
	}
	catch (exception &e)
	{
		cout<<"对不起,您的输入有误! "<<endl ;
	}
	
	return 0 ;
}

这里是设计模式这本书的下载地址: 大话设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值