C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn)
工廠方法模式是在簡(jiǎn)單工廠模式的缺點(diǎn)上進(jìn)行優(yōu)化的,我們都知道,在簡(jiǎn)單工廠模式中,要去增加或者減少一個(gè)產(chǎn)品的類(lèi)型,都需要修改工廠中的if-else判斷。這樣子顯然不符合我們代碼開(kāi)發(fā)中的開(kāi)閉原則,拓展起來(lái)也是非常麻煩的
工廠方法模式 = 簡(jiǎn)單工廠模式 + “開(kāi)閉原則”
定義思想:工廠父類(lèi)負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類(lèi)則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的就是將產(chǎn)品類(lèi)的實(shí)例化操作延遲到工廠子類(lèi)中完成,即通過(guò)工廠子類(lèi)來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類(lèi)
優(yōu)點(diǎn):
- 不需要記住具體的類(lèi)名,甚至連具體參數(shù)都不需要記住
- 實(shí)現(xiàn)了對(duì)象創(chuàng)建和使用的分離
- 系統(tǒng)的可擴(kuò)展性變得更好,符合開(kāi)閉原則
缺點(diǎn):
系統(tǒng)中的類(lèi)是成對(duì)增加,增加了系統(tǒng)的復(fù)雜度和理解度
適用場(chǎng)景:
- 客戶(hù)端不需要知道具體產(chǎn)品類(lèi)的名字,只需要知道其所對(duì)應(yīng)的工廠即可
- 不關(guān)心類(lèi)的創(chuàng)建和實(shí)現(xiàn)的細(xì)節(jié)
代碼實(shí)現(xiàn):(手機(jī)產(chǎn)品)
//抽象手機(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; } }; //蘋(píng)果 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(); } }; //蘋(píng)果工廠 class AppleFactory : public AbstractPhoneFactory { public: virtual AbstractPhone* CreatePhone() { return new Apple(); } };
測(cè)試:
void test() { //創(chuàng)建一個(gè)工廠 AbstractPhoneFactory* factory = nullptr; //創(chuàng)建一個(gè)手機(jī) AbstractPhone* phone = nullptr; //指定工廠是華為工廠 factory = new HuaweiFactory; //通過(guò)華為工廠創(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++使用read()和write()讀寫(xiě)二進(jìn)制文件
以文本形式讀寫(xiě)文件和以二進(jìn)制形式讀寫(xiě)文件的區(qū)別,并掌握了用重載的?>>?和?<<?運(yùn)算符實(shí)現(xiàn)以文本形式讀寫(xiě)文件,在此基礎(chǔ)上,本節(jié)將講解如何以二進(jìn)制形式讀寫(xiě)文件2023-10-10c++ chrono 獲取當(dāng)前時(shí)間的實(shí)現(xiàn)代碼
這篇文章主要介紹了c++ chrono 獲取當(dāng)前時(shí)間的實(shí)現(xiàn)代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07C語(yǔ)言計(jì)算器的3種實(shí)現(xiàn)方法代碼
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言計(jì)算器的3種實(shí)現(xiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一的參考借鑒價(jià)值,需要的朋友可以參考下2007-01-01VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)
使用代碼模板即可實(shí)現(xiàn)像內(nèi)置函數(shù)那樣,只需寫(xiě)幾個(gè)字母,便能提示自動(dòng)補(bǔ)全,本文主要介紹了VS2022添加代碼模板的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-06-06C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)門(mén)禁系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)門(mén)禁系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01學(xué)習(xí)C和C++的9點(diǎn)經(jīng)驗(yàn)總結(jié)
本文給大家總結(jié)了一下我們?cè)趯W(xué)習(xí)C和C++的時(shí)候的一些經(jīng)驗(yàn)和需要注意的事項(xiàng),希望能給大家一些幫助,少走些彎路2015-12-12