工厂方法模式

工厂方法模式定义

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式结构图

图 01 工厂模式结构图

工厂方法模式套用代码

 1 #include "iostream"
 2 using namespace std;
 3 
 4 // 这边只有生产运算的工厂类,而没有运算的具体实现类,建议查看底部实例的代码,很完整
 5 // 如果需要查看运算的具体实现类请查看简单工厂模式
 6 class IFactory
 7 {
 8 public:
 9     virtual Operation* CreateOperation() = 0;
10 };
11 
12 class AddFactory : public IFactory
13 {
14 public:
15     virtual Operation* CreateOperation()
16     {
17         return new OperationAdd()
18     }
19 };
20 
21 class SubFactory : public IFactory
22 {
23     virtual Operation* CreateOperation()
24     {
25         return new OperationSub()
26     }
27 };
28 
29 class MulFactory : public IFactory
30 {
31     virtual Operation* CreateOperation()
32     {
33         return new OperationMul()
34     }
35 };
36 
37 class DivFactory : public IFactory
38 {
39     virtual Operation* CreateOperation()
40     {
41         return new OperationDiv()
42     }
43 };
44 
45 void main()
46 {
47     IFactory* operFactory = new AddFactory();
48     Operation oper = operFactory.CreateOperation();
49     
50     oper.NumberA = 1;
51     oper.NumberB = 2;
52     double result = oper.GetResult();
53 }

简单工厂模式与工厂方法模式的比较

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖但是假设我们现在要添加运算X2,如果使简单工厂模式,我们需要在switch()中添加case语句,这样造成了对原有的类进行修改,违反了开放-封闭,相对的使用工厂模式则不会。

为了方便对比附简单工厂模式的类图如下:

 

图 02 简单工厂模式类图

工厂方法模式实例

下图是关于简单运算使用工厂方法模式类图

 

图 03 工厂模式实例类图

工厂方法模式实例实现代码 
  1 #include "iostream"
  2 using namespace std;
  3 
  4 // 父类
  5 class COperation
  6 {
  7 private:
  8     double numberA;
  9     double numberB;
 10 public:
 11     COperation()
 12     {
 13         numberA = 0;
 14         numberB = 0;
 15     }
 16     inline double GetNumberA() const
 17     {
 18         return numberA;
 19     }
 20 
 21     inline double GetNumberB() const
 22     {
 23         return numberB;
 24     }
 25     
 26     inline void SetNumberB(double numberB)
 27     {
 28         this->numberB = numberB;
 29     }
 30 
 31     inline void SetNumberA(double numberA)
 32     {
 33         this->numberA = numberA;
 34     }
 35     
 36     // 计算结果
 37     virtual double GetResult()
 38     {
 39         return 0.0;
 40     }
 41 };
 42 
 43 //
 44 class COperationAdd : public COperation
 45 {
 46 public:
 47     virtual double GetResult()
 48     {
 49         return GetNumberA() + GetNumberB();
 50     }
 51 };
 52 
 53 //
 54 class COperationSub : public COperation
 55 {
 56 public:
 57     double GetResult()
 58     {
 59         return this->GetNumberA() - this->GetNumberB();
 60     }
 61 };
 62 
 63 //
 64 class COperationMul : public COperation
 65 {
 66 public:
 67     double GetResult()
 68     {
 69         return this->GetNumberA() * this->GetNumberB();
 70     }
 71 };
 72 
 73 //
 74 class COperationDiv : public COperation
 75 {
 76 public:
 77     double GetResult()
 78     {
 79         return this->GetNumberA() / this->GetNumberB();
 80     }
 81 };
 82 
 83 // 工厂父类
 84 class CIFactory
 85 {
 86 public:
 87     // 纯虚函数
 88     virtual COperation* CreateOperation() = 0;
 89 };
 90 
 91 // 生产加法对象的工厂
 92 class CAddFactory : public CIFactory
 93 {
 94 public:
 95     virtual COperation* CreateOperation()
 96     {
 97         return new COperationAdd();
 98     }
 99 };
100 
101 // 生产减法对象的工厂
102 class CSubFactory : public CIFactory
103 {
104 public:
105     virtual COperation* CreateOperation()
106     {
107         return new COperationSub();
108     }
109 };
110 
111 // 生产乘法对象的工厂
112 class CMulFactory : public CIFactory
113 {
114 public:
115     virtual COperation* CreateOperation()
116     {
117         return new COperationMul();
118     }
119 };
120 
121 // 生产除法对象的工厂
122 class CDivFactory : public CIFactory
123 {
124 public:
125     virtual COperation* CreateOperation()
126     {
127         return new COperationDiv();
128     }
129 };
130 
131 void main()
132 {
133     CIFactory* factory = new CDivFactory();
134     COperation* operation = factory->CreateOperation();
135     operation->SetNumberA(17.0);
136     operation->SetNumberB(2.0);
137     cout << operation->GetResult() << endl;
138 }

2014-11-26  22:49:23

 

posted on 2014-11-26 22:39  xiaoheike  阅读(237)  评论(0)    收藏  举报

导航