简单工厂模式、策略模式与工厂方法模式

    用三种设计模式实现同一种功能:四则运算。

    三种设计模式相同的部分为四则运算类的设计,包括基类,加法运算类,减法运算类,乘法运算类和除法运算类,其代码如下:

class CClac
{
public:
	virtual int GetResult(int a,int b)=0;
};

class CClacAdd:public CClac
{
public:
	virtual int GetResult(int a,int b)
	{
		return a+b;
	}
};

class CClacSub:public CClac
{
public:
	virtual int GetResult(int a,int b)
	{
		return a-b;
	}
};

class CClacMul:public CClac
{
public:
	virtual int GetResult(int a,int b)
	{
		return a*b;
	}
};

class CClacDiv:public CClac
{
public:
	virtual int GetResult(int a,int b)
	{
		return a/b;
	}
};
    一、对于简单工厂模式,设计工厂类和main函数代码如下:

class Factory
{
public:
	CClac *CreateCalc(char op)
	{
		CClac *cs=NULL;
		switch(op)
		{
		case '+':
			cs=new CClacAdd;
		    break;
		case '-':
		    cs=new CClacSub;
		    break;
		case '*':
		    cs=new CClacMul;
		    break;
		case '/':
			cs=new CClacDiv;
		    break;
		}
		return cs;
	}
};

void main()
{
	cout<<"Simple Factory Mode:"<<endl;
	int a=6,b=3;
	cout<<"a="<<a<<"\tb="<<b<<endl;
	Factory factory;
	CClac *pCalc=factory.CreateCalc('+');
	cout<<"a+b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	
	pCalc=factory.CreateCalc('-');
	cout<<"a-b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	
	pCalc=factory.CreateCalc('*');
	cout<<"a*b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	
	pCalc=factory.CreateCalc('/');
	cout<<"a/b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
}

    二、对于策略模式,设计的策略类和main函数代码如下:

class Context
{
private:
	CClac *m_pCalc;
public:
	Context(char op)
	{
		m_pCalc=NULL;
		switch(op)
		{
		case '+':
			m_pCalc=new CClacAdd;
		    break;
		case '-':
		    m_pCalc=new CClacSub;
		    break;
		case '*':
		    m_pCalc=new CClacMul;
		    break;
		case '/':
			m_pCalc=new CClacDiv;
		    break;
		}
	}
	virtual ~Context()
	{
		delete m_pCalc;
	}
	
	int GetResult(int a,int b)
	{
		return m_pCalc->GetResult(a,b);
	}
};

void main()
{
	cout<<"Tactics Mode:"<<endl;
	int a=6,b=3;
	cout<<"a="<<a<<"\tb="<<b<<endl;
	
	Context *context=new Context('+');
	cout<<"a+b="<<context->GetResult(a,b)<<endl;
	delete context;
	
	context=new Context('-');
	cout<<"a-b="<<context->GetResult(a,b)<<endl;
	delete context;
	
	context=new Context('*');
	cout<<"a*b="<<context->GetResult(a,b)<<endl;
	delete context;
	
	context=new Context('/');
	cout<<"a/b="<<context->GetResult(a,b)<<endl;
	delete context;
}


    三、对于工厂方法模式,设计的工厂类和main函数如下:

class Factory
{
public:
	virtual CClac *CreateCalc()=0;
};

class FactoryAdd:public Factory
{
public:
	virtual CClac *CreateCalc()
	{
		CClac *cs=NULL;
		cs=new CClacAdd;
		return cs;
	}
};

class FactorySub:public Factory
{
public:
	virtual CClac *CreateCalc()
	{
		CClac *cs=NULL;
		cs=new CClacSub;
		return cs;
	}
};

class FactoryMul:public Factory
{
public:
	virtual CClac *CreateCalc()
	{
		CClac *cs=NULL;
		cs=new CClacMul;
		return cs;
	}
};

class FactoryDiv:public Factory
{
public:
	virtual CClac *CreateCalc()
	{
		CClac *cs=NULL;
		cs=new CClacDiv;
		return cs;
	}
};

void main()
{
	cout<<"Factory Method Mode:"<<endl;
	int a=6,b=3;
	cout<<"a="<<a<<"\tb="<<b<<endl;
	Factory *factory=new FactoryAdd;
	CClac *pCalc=factory->CreateCalc();
	cout<<"a+b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	delete factory;
	
	factory=new FactorySub;
	pCalc=factory->CreateCalc();
	cout<<"a-b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	delete factory;
	
	factory=new FactoryMul;
	pCalc=factory->CreateCalc();
	cout<<"a*b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	delete factory;
	
	factory=new FactoryDiv;
	pCalc=factory->CreateCalc();
	cout<<"a/b="<<pCalc->GetResult(a,b)<<endl;
	delete pCalc;
	delete factory;
}

    对于三种设计模式的理解,简单工厂模式和策略模式的不同在于策略模式将算法进行了进一步的封装,并提供一个统一的接口,客户端只通过策略类就可以完成相关的工作,使得算法的实现和算法的使用分离,减少了算法类和客户端类的耦合。

    简单工厂模式和工厂方法模式的不同在于工厂方法模式对每种方法的实现都提供了一个类,这些类继承于公共的基类,在使用时将基类工厂指针指向专用工厂对象即可,这样的好处在于为更改使用算法提供了方便,如下代码

//简单工厂模式
//当需要将加法改为减法时,需要将三处'+'改为‘-’
Factory factory;
CCalc *calc1=factory.CreateCalc('+');
CCalc *calc2=factory.CreateCalc('+');
CCalc *calc3=factory.CreateCalc('+');

//工厂方法模式
//将加法算法改为减法时,只需将Factory *factory=new FactoryAdd;更改为Factory *factory=new FactorySub;即可
Factory *factory=new FactoryAdd;
CClac *calc1=factory->CreateCalc();
CClac *calc2=factory->CreateCalc();
CClac *calc3=factory->CreateCalc();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值