设计模式一 简单工厂

       参照大话设计模式(程杰),梳理软件工程的程序设计思想,理解面向对象程序设计方法。所谓面向对象设计就是通过封装,继承,重载,多态等方法降低程序的耦合度,使各个功能模块相互独立,易于软件的维护和复用。
       示例功能描述:实现一个简单的计算器,完成基本四则运算。运用简单工厂模式,将运算与客户端分离,并用一个工厂类分别生成相关运算所需要的对象,这个对象实现了运算基类的接口,在客户端调用这个接口返回运算结果。
UML类图:

类accumulate定义了运算的接口GetResult()和运算所需要的操作数numA, numB。类Add,Subtract,Multiply,Divided分别继承于accumulate,并实现了接口GetResult().Factory类与accumulate类相关联,并根据操作符生成相对应的运算类。
 
#include <iostream>
#include <string>
using namespace std;

class Accumulate
{

private:
	double numA;
	double numB;
public:
	Accumulate()
	{
		numA = 0.0;
		numB = 0.0;
	}
	virtual double GetResult()
	{
		double result = 0.0;
		return result;
	}
	double getNumA(){return numA;}
	double getNumB(){return numB;}
	void setNumA(double n){this->numA = n;}
	void setNumB(double n){this->numB = n;}
};

class OpAdd : Accumulate
{
public: 
	double GetResult()
	{
		double result;
		result = getNumA() + getNumB() ;
		return result;
	}
};

class OpSubstruct : Accumulate
{
public:
	double GetResult()
	{
		double result;
		result = getNumA() - getNumB();
		return result;
	}
};

class OpMultiply : Accumulate
{
	double GetResult()
	{
		double result = getNumA() * getNumB();
		return result;
	}
};

class OpDivied : Accumulate
{
	double GetResult()
	{
		double result = 0.0;
		if(getNumB() == 0) cout<<"Error\n";
		else 
		{
			result = getNumA() / getNumB();
		}
		return result;
	}
};

class OperationFactory
{
public:
	static Accumulate* createOperate(char op);	
	static void destroyOp(Accumulate *oper);
};

Accumulate* OperationFactory::createOperate(char op)
{
	Accumulate *oper = NULL;
	switch(op)
	{
	case '+':
		oper = (Accumulate *) new OpAdd;
		break;
	case '-':
		oper = (Accumulate *) new OpSubstruct;
		break;
	case '*':
		oper = (Accumulate *) new OpMultiply;
		break;
	case '/':
		oper = (Accumulate *) new OpDivied;
		break;
	}
	return oper;
}

void OperationFactory::destroyOp(Accumulate *oper)
{
	if(!oper) 
		delete oper;
	return ;
}

int main()
{
	cout<<"请输入数字A:";
	double numA;
	cin>>numA;
	cout<<"请输入运算符(+,-,*,/)";
	char al;
	cin>>al;
	cout<<"请输入数字B:";
	double numB;
	cin>>numB;
	
	Accumulate *opra;	
	opra = OperationFactory::createOperate(al);	
	opra->setNumA(numA);
	opra->setNumB(numB);
	cout<<opra->GetResult()<<'\n';
	OperationFactory::destroyOp(opra);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值