简单工厂模式(静态工厂方法模式)

以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象。通过多态,返回父类的方式实现了计算器的结果。

1)静态工厂方法统一管理对象的创建。

  静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。

2)静态工厂方法推迟了产品的实例化。

  通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译。

              简单工厂模式结构图

C++代码实例实现:

  1 #include<iostream>
  2 using namespace std;
  3 
  4 class Operation{
  5 private:
  6     double numberA;
  7     double numberB;
  8 public:
  9     Operation();
 10     double GetNumberA();
 11     void SetNumberA(double);
 12     double GetNumberB();
 13     void SetNumberB(double);
 14     virtual double GetResult()
 15     {
 16         double result = 0;
 17         return result;
 18     }
 19 };
 20 //函数实现
 21 Operation::Operation()
 22 {
 23     numberA = 0;
 24     numberB = 0;
 25 }
 26 double Operation::GetNumberA()
 27 {
 28     return numberA;
 29 }
 30 void Operation::SetNumberA(double a)
 31 {
 32     numberA = a;
 33 }
 34 
 35 double Operation::GetNumberB()
 36 {
 37     return numberB;
 38 }
 39 void Operation::SetNumberB(double b)
 40 {
 41     numberB = b;
 42 }
 43  
 44 class OperationAdd : public Operation
 45 {
 46 public:
 47     virtual double GetResult()
 48     {
 49         double result = 0;
 50         result = GetNumberA() + GetNumberB();
 51         return result;
 52     }
 53 };
 54 class OperationSub : public Operation
 55 {
 56 public:
 57     virtual double GetResult()
 58     {
 59         double result = 0;
 60         result = GetNumberA() - GetNumberB();
 61         return result;
 62     }
 63 };
 64 class OperationMul : public Operation
 65 {
 66 public:
 67     virtual double GetResult()
 68     {
 69         double result = 0;
 70         result = GetNumberA() * GetNumberB();
 71         return result;
 72     }
 73 };
 74 class OperationDiv : public Operation
 75 {
 76 public:
 77     virtual double GetResult()
 78     {
 79         double result = 0;
 80         if(GetNumberB() == 0)
 81             return -1;
 82         result = GetNumberA() / GetNumberB();
 83         return result;
 84     }
 85 };
 86 //工厂类
 87 class OperationFactory
 88 {
 89 public:
 90     //静态工厂方法
 91     static Operation* createOperate(char c)
 92     {
 93         switch(c)
 94         {
 95         case '+':
 96             return new OperationAdd();
 97             break;
 98         case '-':
 99             return new OperationSub();
100             break;
101         case '*':
102             return new OperationMul();
103             break;
104         case '/':
105             return new OperationDiv();
106             break;
107         }
108         return NULL;
109     }
110 
111 };
112 void main()
113 {//客户端代码
114     
115     OperationFactory operfactory;
116     Operation *oper = operfactory.createOperate('+'); 
117     oper->SetNumberA(2);
118     oper->SetNumberB(4);
119     double result = oper->GetResult();
120     cout << result <<endl;
121 }

 这样就实现了后台代码与界面实现代码的隔离。不管是控制台程序,Windows程序,Web程序,都可以用客户端代码实现计算器的功能。界面的修改与运算程序无关。如果我们要更改加法运算,只需改OperationAdd类就可以,如果需要增加复杂运算,只需增加相应的运算子类并修改运算类工厂,在switch中加入一个分支就可以。

posted @ 2017-01-21 18:56  花椰菜菜菜菜  阅读(347)  评论(0编辑  收藏  举报