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

图 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
浙公网安备 33010602011771号