在之前的文章中介紹了設(shè)計(jì)模式中最簡(jiǎn)單的一種望伦,傳送門(mén):設(shè)計(jì)模式之單例模式。今天再來(lái)介紹另外一種比較常見(jiàn)的工廠(chǎng)方法模式宪摧,他是對(duì)象模式三劍客建設(shè)者模式? 工廠(chǎng)方法模式? 抽象工廠(chǎng)模式之一。
在介紹工廠(chǎng)方法模式之前照捡,先介紹一種簡(jiǎn)單的模式:簡(jiǎn)單工廠(chǎng)模式:它屬于創(chuàng)建型模式,又叫做靜態(tài)工廠(chǎng)方法(Static Factory Method)模式话侧。簡(jiǎn)單工廠(chǎng)模式是由一個(gè)工廠(chǎng)對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例栗精。簡(jiǎn)單工廠(chǎng)模式是工廠(chǎng)模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠(chǎng)模式的一個(gè)特殊實(shí)現(xiàn)。但是它并不屬于23中GOF設(shè)計(jì)模式中的一種悲立,它只是工廠(chǎng)方法的基礎(chǔ)鹿寨。
1、簡(jiǎn)單工廠(chǎng)模式
在介紹簡(jiǎn)單工廠(chǎng)之前薪夕,先自己寫(xiě)一個(gè)功能脚草。假設(shè)咱們現(xiàn)在要實(shí)現(xiàn)一個(gè)計(jì)算器例子,為了實(shí)現(xiàn)各算法之間的解耦原献,先定義一個(gè)抽象的Calculator類(lèi):
其中定義了一個(gè)方法getResult();這個(gè)方法由其子類(lèi)來(lái)重寫(xiě)返回值馏慨;下面寫(xiě)一個(gè)add 的類(lèi)其他類(lèi)似:
下面測(cè)試方法:
可以看到當(dāng)我需要執(zhí)行加法運(yùn)算時(shí),我就要?jiǎng)?chuàng)建一個(gè)CalculatorAdd類(lèi)姑隅。如果是減法那么我就要?jiǎng)?chuàng)建一個(gè)CalculatorSub類(lèi)以此類(lèi)推.....
也就是說(shuō)写隶,我想要使用不同的運(yùn)算的時(shí)候就要?jiǎng)?chuàng)建不同的類(lèi),并且要明確知道該類(lèi)的名字讲仰。
那么這種重復(fù)的創(chuàng)建類(lèi)的工作其實(shí)可以放到一個(gè)統(tǒng)一的工廠(chǎng)類(lèi)中---簡(jiǎn)單工廠(chǎng)慕趴。
定義一個(gè)工廠(chǎng)類(lèi)負(fù)責(zé)生產(chǎn)產(chǎn)品:
這樣一個(gè)簡(jiǎn)單工廠(chǎng),調(diào)用者只需要知道一個(gè)type 操作就可以得到相應(yīng)的對(duì)象”:
可以看到這樣確實(shí)優(yōu)化了很多鄙陡,但是由于工廠(chǎng)類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯秩贰,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建對(duì)象的邏輯集中放到了一個(gè)工廠(chǎng)類(lèi)中柔吼;它所能創(chuàng)建的類(lèi)只能是事先考慮到的,如果需要添加新的類(lèi)丙唧,則就需要改變工廠(chǎng)類(lèi)了愈魏。
當(dāng)系統(tǒng)中的具體類(lèi)不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠(chǎng)類(lèi)根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類(lèi)型的判斷交錯(cuò)在一起想际,很難避免模塊功能的蔓延培漏,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;這個(gè)時(shí)候工廠(chǎng)方法模式就比較好了胡本。
2牌柄、工廠(chǎng)方法模式
工廠(chǎng)方法模式(Factory Method Pattern)又稱(chēng)為工廠(chǎng)模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(chǎng)(Polymorphic Factory)模式侧甫,它屬于類(lèi)創(chuàng)建型模式珊佣。
這里還用計(jì)算器的例子。在保持Calculator披粟,CalculatorAdd咒锻,CalculatorDiv,CalculatorSub守屉,CalculatorMul等幾個(gè)方法不變的情況下惑艇,修改簡(jiǎn)單工廠(chǎng)模式中的工廠(chǎng)類(lèi)(CalculatorFactory)。替代原有的那個(gè)”萬(wàn)能”的大工廠(chǎng)類(lèi),這里使用工廠(chǎng)方法來(lái)代替:
這樣滨巴,在客戶(hù)端中想要執(zhí)行加法運(yùn)算時(shí)思灌,需要以下方式:
工廠(chǎng)方法模式是簡(jiǎn)單工廠(chǎng)模式的進(jìn)一步抽象和推廣。
工廠(chǎng)方法模式中恭取,核心的工廠(chǎng)類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建泰偿,而是將具體創(chuàng)建工作交給子類(lèi)去做。這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠(chǎng)必須實(shí)現(xiàn)的接口秽荤,而不負(fù)責(zé)產(chǎn)品類(lèi)被實(shí)例化這種細(xì)節(jié)甜奄,這使得工廠(chǎng)方法模式可以允許系統(tǒng)在不修改工廠(chǎng)角色的情況下引進(jìn)新產(chǎn)品。
工廠(chǎng)方法模式的主要優(yōu)點(diǎn)是增加新的產(chǎn)品類(lèi)時(shí)無(wú)須修改現(xiàn)有系統(tǒng)窃款,并封裝了產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié)课兄,系統(tǒng)具有良好的靈活性和可擴(kuò)展性;其缺點(diǎn)在于增加新產(chǎn)品的同時(shí)需要增加新的工廠(chǎng)晨继,導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)成對(duì)增加烟阐,在一定程度上增加了系統(tǒng)的復(fù)雜性。