简述:
简单工厂模式,如其名,简单,简单到明明是24种设计模式,却只归类为23种设计模式,把它排除了,但我还是写了出来。
简单工厂模式包括:工厂类、抽象产品类、具体产品类。
工厂类:制造产品,会有一个Create之类得函数,可以根据不同的标识符生产不同的具体产品,当然这些具体产品都继承自抽象产品。
抽象产品类:具体产品类的基类。
具体产品类:抽象产品类的派生类,当需要增加新的产品时,可以根据需要增加一个继承自抽象产品类的具体产品类,然后在工厂类中增加相应的处理分支即可。
简单工厂模式实现了松耦合,当需要新增一种产品时,只需要做两点改动:
增加一个继承自抽象类的具体产品类。
在工厂类中增加响应的处理分支。
例:加减乘除四则运算
代码如下:
1 #include <iostream> 2 using namespace std; 3 4 // 运算基类(抽象产品类) 5 class COperation 6 { 7 private: 8 double m_dA = 0; 9 double m_dB = 0; 10 public: 11 void SetA(double dA) 12 { 13 m_dA = dA; 14 } 15 double GetA() 16 { 17 return m_dA; 18 } 19 void SetB(double dB) 20 { 21 m_dB = dB; 22 } 23 double GetB() 24 { 25 return m_dB; 26 } 27 virtual double GetResult() 28 { 29 double dResult = 0; 30 return dResult; 31 } 32 }; 33 34 // 加法类(具体产品类) 35 class COperationAdd : public COperation 36 { 37 public: 38 virtual double GetResult() 39 { 40 double dResult = 0; 41 dResult = GetA() + GetB(); 42 return dResult; 43 } 44 }; 45 46 // 减法类(具体产品类) 47 class COperationSub : public COperation 48 { 49 public: 50 virtual double GetResult() 51 { 52 double dResult = 0; 53 dResult = GetA() - GetB(); 54 return dResult; 55 } 56 }; 57 58 // 乘法类(具体产品类) 59 class COperationMul : public COperation 60 { 61 public: 62 virtual double GetResult() 63 { 64 double dResult = 0; 65 dResult = GetA() * GetB(); 66 return dResult; 67 } 68 }; 69 70 // 除法类(具体产品类) 71 class COperationDiv : public COperation 72 { 73 public: 74 virtual double GetResult() 75 { 76 double dResult = 0; 77 if (0 == GetB()) 78 throw "除数不能为0!"; 79 dResult = GetA() / GetB(); 80 return dResult; 81 } 82 }; 83 84 // 简单工厂类 85 class COperationFactory 86 { 87 public: 88 static COperation* CreateOperate(char chOperate) 89 { 90 COperation* pOperation = NULL; 91 switch (chOperate) 92 { 93 case '+': 94 pOperation = new COperationAdd(); 95 break; 96 case '-': 97 pOperation = new COperationSub(); 98 break; 99 case '*': 100 pOperation = new COperationMul(); 101 break; 102 case '/': 103 pOperation = new COperationDiv(); 104 break; 105 } 106 return pOperation; 107 } 108 }; 109 110 int main() 111 { 112 COperation* pOperation; 113 char chType = '/'; 114 pOperation = COperationFactory::CreateOperate(chType); 115 pOperation->SetA(10); 116 pOperation->SetB(2); 117 118 double dResult = pOperation->GetResult(); 119 cout << dResult << endl; 120 121 // C++堆区创建的对象需要手动释放资源 122 if (pOperation) 123 delete pOperation; 124 125 system("pause"); 126 return 0; 127 }
输出结果: