用三种设计模式实现同一种功能:四则运算。
三种设计模式相同的部分为四则运算类的设计,包括基类,加法运算类,减法运算类,乘法运算类和除法运算类,其代码如下:
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;
}
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();