在上一篇中我們學(xué)習(xí)了簡(jiǎn)單工廠模式,通過簡(jiǎn)單工廠的引入我們使MoonCakeStore類遵循了對(duì)修改關(guān)閉的原則过咬。在簡(jiǎn)單工廠模式中,我們所有的月餅創(chuàng)建都放在了工廠中進(jìn)行蚓哩,那如果要增加或刪除月餅時(shí)咬展,簡(jiǎn)單工廠類還是會(huì)被我們頻繁的修改,似乎這SimpleFactory并沒有滿足我們的“對(duì)修改關(guān)閉對(duì)擴(kuò)展開放原則”
接下來鸽粉,我們?cè)偎伎家粋€(gè)問題如果有一天我們的月餅店做的大了,有了加盟店而且每個(gè)新店都要把月餅進(jìn)行本地化抓艳,比如:內(nèi)蒙古:五仁月餅要加點(diǎn)牛肉,四川:五仁月餅要加點(diǎn)辣椒帚戳,上海:五仁月餅要加點(diǎn)糖玷或。這樣的需求出現(xiàn)后,我們的SimpleFactory徹底滿足不了我們的需求了片任。
今天我們來學(xué)習(xí)一個(gè)新的設(shè)計(jì)模式之工廠方法模式來解決 1:Factory類沒有滿足對(duì)修改關(guān)閉對(duì)擴(kuò)展開放原則偏友,2:滿足可以添加加盟店的需求。
1:什么工廠方法模式
定義:定義一個(gè)創(chuàng)建對(duì)象的接口对供,由子類來決定要實(shí)例化哪一個(gè)類位他。工廠方法模式讓類的實(shí)例化推遲到子類
類圖:
抽象產(chǎn)品類:是所有產(chǎn)品的共同接口,所有的具體產(chǎn)品都需要實(shí)現(xiàn)這 個(gè)接口,這樣一來創(chuàng)建者就只需要依賴這個(gè)接口,不需要維護(hù)一大堆的具體產(chǎn)品
具體產(chǎn)品類:實(shí)現(xiàn)了產(chǎn)品接口,定義具體的產(chǎn)品
抽象創(chuàng)建者類:是一個(gè)抽象類,在類中定義了一個(gè)抽象的生產(chǎn)產(chǎn)品方法然后交給子類去實(shí)現(xiàn)
具體創(chuàng)建者類:用來生產(chǎn)具體的產(chǎn)品, 繼承于抽象創(chuàng)建者類并實(shí)現(xiàn)生產(chǎn)具體產(chǎn)品的方法
2:實(shí)現(xiàn)工廠方法模式
1:修改MoonCakeStore(添加創(chuàng)建對(duì)象接口,交由子類實(shí)現(xiàn)),使其變成Creator類
2:添加四川产场,內(nèi)蒙鹅髓,北京的特色加盟店
3:創(chuàng)建四川風(fēng)味牛肉月餅,內(nèi)蒙風(fēng)味牛肉月餅京景,北京風(fēng)味牛肉月餅
4:下面讓我們來生產(chǎn)三個(gè)不同風(fēng)味的牛肉月餅
3:工廠方法的使用場(chǎng)景
1):在你的工程里窿冯,當(dāng)客戶端需要?jiǎng)?chuàng)建一個(gè)對(duì)象,但不又想讓客戶端知道創(chuàng)建這個(gè)對(duì)象的具體類是什么的時(shí)候确徙,就可以使用工廠方法來代替醒串,(因?yàn)槭褂霉S方法后执桌,客戶端只需要知道這些產(chǎn)品的抽象接口如:IMoonCake,和可以生產(chǎn)這個(gè)產(chǎn)品的工廠即可)
2):在工程里,當(dāng)一個(gè)類需要他的子來創(chuàng)建指定的對(duì)象時(shí)(我們定義了MoonCakeStore,但是MoonCake的創(chuàng)建卻是交給他的子SCMCStore,NMMCStore來創(chuàng)建)
4:工廠方法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1):工廠方法提供產(chǎn)品的創(chuàng)建芜赌,隱藏了產(chǎn)品的具體類名仰挣,是產(chǎn)品的“使用“和“實(shí)現(xiàn)”相互獨(dú)立,提供了一套框架缠沈,讓子類去創(chuàng)建產(chǎn)品
2):當(dāng)需要新增新的產(chǎn)品時(shí)膘壶,不需要修改框架代碼,只需要添加一個(gè)新的產(chǎn)品并繼承共同的接口博烂,然后再增加一個(gè)生產(chǎn)這個(gè)產(chǎn)品的工廠
缺點(diǎn):每次新一個(gè)產(chǎn)品都要新增加二個(gè)類香椎,一個(gè)具體產(chǎn)品類,一個(gè)工廠類禽篱,如果產(chǎn)品太多畜伐,會(huì)導(dǎo)致我們的系統(tǒng)出現(xiàn)大量的類,難以維護(hù)