工廠方法模式是在簡單工廠模式的缺點(diǎn)上進(jìn)行優(yōu)化的,我們都知道,在簡單工廠模式中,要去增加或者減少一個(gè)產(chǎn)品的類型,都需要修改工廠中的if-else判斷。這樣子顯然不符合我們代碼開發(fā)中的開閉原則,拓展起來也是非常麻煩的
工廠方法模式 = 簡單工廠模式 + “開閉原則”
定義思想:工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的就是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類
優(yōu)點(diǎn):
- 不需要記住具體的類名,甚至連具體參數(shù)都不需要記住
- 實(shí)現(xiàn)了對象創(chuàng)建和使用的分離
- 系統(tǒng)的可擴(kuò)展性變得更好,符合開閉原則
缺點(diǎn):
系統(tǒng)中的類是成對增加,增加了系統(tǒng)的復(fù)雜度和理解度
適用場景:
- 客戶端不需要知道具體產(chǎn)品類的名字,只需要知道其所對應(yīng)的工廠即可
- 不關(guān)心類的創(chuàng)建和實(shí)現(xiàn)的細(xì)節(jié)
代碼實(shí)現(xiàn):(手機(jī)產(chǎn)品)
1
2
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
|
//抽象手機(jī) class AbstractPhone { public : virtual void ShowName() = 0; }; //華為 class Huawei : public AbstractPhone { public : virtual void ShowName() { cout << "Huawei Phone" << endl; } }; //小米 class Xiaomi : public AbstractPhone { public : virtual void ShowName() { cout << "Xiaomi Phone" << endl; } }; //蘋果 class Apple : public AbstractPhone { public : virtual void ShowName() { cout << "Apple Phone" << endl; } }; //抽象工廠 class AbstractPhoneFactory { public : virtual AbstractPhone* CreatePhone() = 0; }; //華為工廠 class HuaweiFactory : public AbstractPhoneFactory { public : virtual AbstractPhone* CreatePhone() { return new Huawei(); } }; //小米工廠 class XiaomiFactory : public AbstractPhoneFactory { public : virtual AbstractPhone* CreatePhone() { return new Xiaomi(); } }; //蘋果工廠 class AppleFactory : public AbstractPhoneFactory { public : virtual AbstractPhone* CreatePhone() { return new Apple(); } }; |
測試:
1
2
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
|
void test() { //創(chuàng)建一個(gè)工廠 AbstractPhoneFactory* factory = nullptr; //創(chuàng)建一個(gè)手機(jī) AbstractPhone* phone = nullptr; //指定工廠是華為工廠 factory = new HuaweiFactory; //通過華為工廠創(chuàng)建一個(gè)手機(jī) phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; factory = new XiaomiFactory; phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; factory = new AppleFactory; phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; } |
運(yùn)行結(jié)果:
總結(jié)
到此這篇關(guān)于C++設(shè)計(jì)模式之工廠方法模式的文章就介紹到這了,更多相關(guān)C++工廠方法模式內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_44443986/article/details/117519327