C++實現設計模式之 — 簡單工廠模式

做者: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 }

 

 

本文參考自:程傑《大話設計模式》指針

相關文章
相關標籤/搜索