设计模式-简单工厂设计

面向对象的设计模式——简单的工厂设计

我们以一个计算器加减乘除的例子,来分析这个问题:
当我们用类来实现计算器加减乘除运算时,很容易可以想到如何来写。
首先声明一个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;

工厂模式优缺点

优点:不需要考虑实例化创造的过程,与客户端解耦,扩展性强,使用者只需要关系接口就可以了。
缺点:每增加一种功能都需要在工厂中加入,还需要加入一个派生类,使得系统类过多,且增加了系统的复杂度。


最后感谢程杰大佬的《大话设计模式》。

下一篇策略模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值