問題描述
之前講到了c++設計模式——簡單工廠模式,由於簡單工廠模式的侷限性,比如:工廠現在能生產producta、productb和productc三種產品了,此時,需要增加生產productd產品;那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結構**。是的,這種對**的修改,對原有**的改動量較大,易產生編碼上的錯誤(雖然很簡單,如果工程大了,出錯也是在所難免的!!!)。這種對**的修改是最原始,最野蠻的修改,本質上不能稱之為對**的擴充套件。同時,由於對已經存在的函式進行了修改,那麼以前進行過的測試,都將是無效的,所有的測試,都將需要重新進行,所有的**都需要進行重新覆蓋。這種,增加成本,不能提高效率的事情,在公司是絕對不允許的(除非昏庸的pm)。出於種種原因,簡單工廠模式,在實際專案中使用的較少。那麼該怎麼辦?怎麼辦呢?需要對原有**影響降到最小,同時能對原有功能進行擴充套件。
uml類圖
那麼今天介紹的工廠方法模式,就隆重登場了。它只是對簡單工廠模式的擴充套件,在gof的介紹中,它們是合併在一起的,而我則是單獨分開進行講解的,就是為了區分二者的利弊,便於大家在實際專案中進行更好的把握與應用。工廠方法模式是在簡單工廠模式的基礎上,對「工廠」新增了乙個抽象層。將工廠共同的動作抽象出來,作為抽象類,而具體的行為由子類本身去實現,讓子類去決定生產什麼樣的產品。
如圖,factorya專心負責生產producta,factoryb專心負責生產productb,factorya和factoryb之間沒有關係;如果到了後期,如果需要生產productc時,我們則可以建立乙個factoryc工廠類,該類專心負責生產productc類產品。由於factorya、factoryb和factoryc之間沒有關係,當加入factoryc加入時,對factorya和factoryb的工作沒有產生任何影響,那麼對**進行測試時,只需要單獨對factoryc和productc進行單元測試,而factorya和factoryb則不用進行測試,則可省去大量無趣無味的測試工作。
適用場合
工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
1.在設計的初期,就考慮到產品在後期會進行擴充套件的情況下,可以使用工廠方法模式;
2.產品結構較複雜的情況下,可以使用工廠方法模式;
由於使用設計模式是在詳細設計時,就需要進行定奪的,所以,需要權衡多方面的因素,而不能為了使用設計模式而使用設計模式。
**實現:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
** filename : factorymethodpatterndemo
** author : jelly young
** date : 2013/11/18
** description : more information, please go to
*/
#include
using
namespace
std;
class
product
;
class
producta :
public
product
};
class
productb :
public
product
};
class
factory
;
class
factorya :
public
factory
};
class
factoryb :
public
factory
};
int
main(
int
argc ,
char
*argv )
if
(producta != null)
if
(factoryb != null)
if
(productb != null)
return
0;
}
本文出自:/article/55860.htm
工廠方法模式 C 設計模式之1 工廠方法模式
工廠方法模式屬於建立型模式,定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,僅僅是通過使用乙個共同的介面來指向新建立的物件。1 抽象工廠 creator 是工廠方法...
C 設計模式之工廠方法模式
問題描述 之前講到了c 設計模式 簡單工廠模式,由於簡單工廠模式的侷限性,比如 工廠現在能生產producta productb和productc三種產品了,此時,需要增加生產productd產品 那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結...
C 設計模式之工廠方法模式
工廠方法模式 解決簡單工廠模式中系統難以擴充套件的問題而設計 實現方法 把具體的產品建立推遲到子類中,此時工廠類就不在負責所有產品的建立,而只是給出具體工廠必須實現的介面,這樣工廠方法模式就可以允許系統不修改工廠類邏輯的情況下新增新產品,這樣也就克服了簡單工廠模式中缺點。客戶端呼叫 private ...