面向对象的设计模式——简单的工厂设计
我们以一个计算器加减乘除的例子,来分析这个问题:
当我们用类来实现计算器加减乘除运算时,很容易可以想到如何来写。
首先声明一个Operation的类,然后声明一个Getresult(double a,double b ,char operate)的方法,通过传入的operate,来决定我们执行什么样的操作。
正常类设计
我们分为C/S的模式来写如下代码:
首先是服务器端:
class Operation{
public :
double Getresult(double a, double b, char operate){
double result = 0;
switch(operate){
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
return result;
}
};
客户端代码就简单了:
double a,b;
char operate;
cin>>a>>b;
getchar();
cin>>operate;
Operation sum;
cout<<sum.Getresult(a,b,operate);
工厂模式设计
现在就存在一个问题,如果我要增加运算比如说sqrt运算怎么办,总不能把服务器端已经运行非常稳定代码全部给开发人员吧。如果他更改里面的逻辑,后果就会很严重。所以此时我们就需要更换一个思路------继承,多态)
不多说,直接上代码,此时我们服务端就可以改成。
class Operation{
protected:
double a,b;
public:
void set_a(double num){
a=num;
}
void set_b(double num){
b=num;
}
virtual double Getresult(){
double result = 0;
return result;
}
};
后续开发人员要想加入新功能只需要继承基类:
class OperationAdd : public Operation{
public:
virtual double Getresult(){
double result = 0;
result = a + b ;
return result;
}
};
class OperationSub : public Operation{
public:
virtual double Getresult(){
double result = 0;
result = a - b ;
return result;
}
};
class OperationMul : public Operation{
public:
virtual double Getresult(){
double result = 0;
result = a * b ;
return result;
}
};
class OperationDiv : public Operation{
public:
virtual double Getresult(){
double result=0;
result = a / b ;
return result;
}
};
另外我们要想实例化一个比如说加法类。我们可以把总体看成一个工厂,我想用那个类,我们就生产哪个类。
class Operation_Factory{
public:
static Operation* createOperate(char operate){
switch(operate){
case '+':
return new OperationAdd;
case '-':
return new OperationSub;
case '*':
return new OperationMul;
case '/':
return new OperationDiv;
}
}
};
此时我们的客户端代码就可以写成:
Operation_Factory* factory = new Operation_Factory;
Operation* oper =factory->createOperate('+'); //实例出一个加法类
oper->set_a(1),oper->set_b(2);
cout<<oper->Getresult();
delete factory;
delete oper;
工厂模式优缺点
优点:不需要考虑实例化创造的过程,与客户端解耦,扩展性强,使用者只需要关系接口就可以了。
缺点:每增加一种功能都需要在工厂中加入,还需要加入一个派生类,使得系统类过多,且增加了系统的复杂度。
最后感谢程杰大佬的《大话设计模式》。