做者:jostree 轉載請註明出處 http://www.cnblogs.com/jostree/p/4251756.htmlhtml
所謂簡單工廠模式,是一種實例化對象的方式,只要輸入須要實例化對象的名字,就能夠經過工廠對象的相應工廠函數來製造你須要的對象。ios
簡單工廠模式的核心是,對於一個父類的多個繼承子類,工廠對象的工廠函數根據用戶輸入,自動new出一個子類對象並返回其父類的指針,這樣利用父類的指針執行父類的虛函數,就能夠動態綁定子類的重寫函數,從而實現多態。設計模式
對於一個只擁有加減乘除運算的簡單計算器,咱們設計一個Operation的父類,並構造加減乘除四個類繼承父類重寫運算函數GetResult。而後定義工廠類中的工廠函數,其根據用戶的輸入new出相應的對象實例並返回其父類的指針。函數
UML圖以下所示:spa
C++代碼以下所示,其中使用了智能指針類shared_ptr,當該對象的生命期結束時,其析構函數可以自動析構掉指針所指的對象。設計
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 #include <tr1/memory> 6 7 using namespace std; 8 9 class Operation 10 { 11 private: 12 double A, B; 13 public: 14 double GetA() const {return A;} 15 double GetB() const {return B;} 16 void SetA(double x) {A=x;} 17 void SetB(double y) {B=y;} 18 double virtual GetResult(){return 0;} 19 Operation():A(0), B(0){} 20 }; 21 22 class Add : public Operation 23 { 24 public: 25 double GetResult() 26 { 27 return GetA()+GetB(); 28 } 29 }; 30 31 class Sub : public Operation 32 { 33 public: 34 double GetResult() 35 { 36 return GetA()-GetB(); 37 } 38 }; 39 40 class Mul : public Operation 41 { 42 public: 43 double GetResult() 44 { 45 return GetA()*GetB(); 46 } 47 }; 48 49 class Div : public Operation 50 { 51 public: 52 double GetResult() 53 { 54 return GetA()/GetB(); 55 } 56 }; 57 58 class SimpleFactory 59 { 60 public: 61 static Operation * CreateOpeartor(char ch) 62 { 63 Operation * p; 64 switch(ch) 65 { 66 case '+': 67 p = new Add(); 68 break; 69 case '-': 70 p = new Sub(); 71 break; 72 case '*': 73 p = new Mul(); 74 break; 75 case '/': 76 p = new Div(); 77 break; 78 } 79 return p; 80 } 81 }; 82 83 int main(int argc, char *argv[]) 84 { 85 double A = 0; 86 double B = 0; 87 char ch = '\0'; 88 cin>>A>>ch>>B; 89 90 tr1::shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch)); 91 op->SetA(A); 92 op->SetB(B); 93 cout<<op->GetResult()<<endl; 94 }
本文參考自:程傑《大話設計模式》指針