設(shè)計(jì)模式之工廠(chǎng)方法模式

在之前的文章中介紹了設(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):


Calculator.java

其中定義了一個(gè)方法getResult();這個(gè)方法由其子類(lèi)來(lái)重寫(xiě)返回值馏慨;下面寫(xiě)一個(gè)add 的類(lèi)其他類(lèi)似:


CalculatorAdd.java

下面測(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)品:


CalculatorFactory.java


這樣一個(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)代替:


工廠(chǎng)類(lèi)接口
add工廠(chǎng)

這樣滨巴,在客戶(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ù)雜性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末紊扬,一起剝皮案震驚了整個(gè)濱河市蜒茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌餐屎,老刑警劉巖檀葛,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腹缩,居然都是意外死亡屿聋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)藏鹊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)润讥,“玉大人,你說(shuō)我怎么就攤上這事盘寡〕睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵竿痰,是天一觀(guān)的道長(zhǎng)脆粥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)影涉,這世上最難降的妖魔是什么冠绢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮常潮,結(jié)果婚禮上弟胀,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好孵户,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布萧朝。 她就那樣靜靜地躺著,像睡著了一般夏哭。 火紅的嫁衣襯著肌膚如雪检柬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天竖配,我揣著相機(jī)與錄音何址,去河邊找鬼。 笑死进胯,一個(gè)胖子當(dāng)著我的面吹牛用爪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胁镐,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偎血,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了盯漂?” 一聲冷哼從身側(cè)響起颇玷,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎就缆,沒(méi)想到半個(gè)月后帖渠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竭宰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年空郊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞延。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脾还,靈堂內(nèi)的尸體忽然破棺而出伴箩,到底是詐尸還是另有隱情,我是刑警寧澤鄙漏,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布嗤谚,位于F島的核電站,受9級(jí)特大地震影響怔蚌,放射性物質(zhì)發(fā)生泄漏巩步。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一桦踊、第九天 我趴在偏房一處隱蔽的房頂上張望椅野。 院中可真熱鬧,春花似錦、人聲如沸竟闪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炼蛤。三九已至妖爷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間理朋,已是汗流浹背絮识。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗽上,地道東北人次舌。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炸裆,于是被迫代替她去往敵國(guó)和親垃它。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容