工廠設(shè)計(jì)模式

工廠造門

造房子時(shí)需要一個(gè)門杨名,你是穿上木匠服開始在你家門口鋸木頭,搞得一團(tuán)糟猖毫?還是從工廠里生產(chǎn)一個(gè)台谍?

依賴倒置原則,指導(dǎo)我們避免依賴具體類型吁断,而要盡量依賴抽象趁蕊。所有的工廠都是用來封裝對(duì)象的創(chuàng)建,以便將代碼從具體類解耦仔役。

我們把三個(gè)工廠理一遍:

  • 簡(jiǎn)單工廠掷伙,是針對(duì)一種“類型”的抽象。
  • 工廠方法又兵,是針對(duì)一種“類型”任柜,以及一種“創(chuàng)建方法”的抽象。
  • 抽象工廠沛厨,是針對(duì)一組“類型”與“創(chuàng)建方法”的抽象宙地,組內(nèi)每一套類型與創(chuàng)建方法一一對(duì)應(yīng)。

用造門這個(gè)例子來說:

  • 簡(jiǎn)單工廠逆皮,是封裝了“造門”的操作宅粥,輸出的是一種門。
  • 工廠方法电谣,是封裝了“多種造門”的操作秽梅,并委托“多家工廠”,輸出的是“各種門”剿牺。
  • 抽象工廠企垦,是封裝了“多種造門”的操作,“提供多種專業(yè)人員”的操作晒来,并委托給“多家工廠”钞诡,輸出的是“各種門”,以及“各種專業(yè)人員”,且“門”與“專業(yè)人員”一一對(duì)應(yīng)臭增。

附客戶端調(diào)用的代碼:

$door = DoorFactory::makeDoor(100, 200); // 客戶不需要先指定委托對(duì)象懂酱。傳遞門寬高,輸出一種規(guī)格的門
// 木門
$woodenDoorManager = new WoodenDoorManager();
$door = $woodenDoorManager->makeDoor(100, 200);

// 鐵門
$ironDoorManager = new IronDoorManager();
$door = $ironDoorManager->makeDoor(100, 200); // 客戶需要先指定委托對(duì)象誊抛。委托給*DoorManager列牺,輸出"各種門"
// 木門
$woodenFactory = new WoodenDoorFactory();
$door = $woodenFactory->makeDoor();  // 輸出門
$expert = $woodenFactory->makeFittingExpert(); // 還輸出專業(yè)人員,且"門"與"專業(yè)人員"一一對(duì)應(yīng)拗窃。
$door->getDescription();
$expert->getDescription();

// 鐵門
$ironFactory = new IronDoorFactory();
$door = $ironFactory->makeDoor();
$expert = $ironFactory->makeFittingExpert();
$door->getDescription();
$expert->getDescription(); // 多種造門瞎领。委托給"多家工廠",輸出"各種門"随夸。且"門"與"專業(yè)人員"一一對(duì)應(yīng)九默。

附分別的UML圖:

定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例宾毒,被創(chuàng)建的實(shí)例通常都具有共同的父類驼修。

簡(jiǎn)單工廠

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定將哪一個(gè)類實(shí)例化诈铛。工廠方法模式讓一個(gè)類的實(shí)例化延遲到其子類乙各。

工廠方法

提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無須指定它們具體的類幢竹。

抽象工廠

工廠方法和簡(jiǎn)單工廠有啥區(qū)別耳峦?

兩者最大的區(qū)別:抽象的維度。

  • 簡(jiǎn)單工廠的抽象焕毫,是一維的蹲坷,它抽象的僅僅是所創(chuàng)建"類型"的接口;
  • 而工廠方法的抽象邑飒,是二維的循签,它不僅抽象了所創(chuàng)建"類型"的接口,而且抽象了"方法"的接口幸乒。

具體到例子里懦底,簡(jiǎn)單工廠實(shí)例中,客戶就是要一個(gè)門, 而不關(guān)心創(chuàng)建過程, 最后實(shí)際創(chuàng)造的是一個(gè)木門罕扎。這個(gè)頗為諷刺,如果客戶要的是個(gè)鐵門呢丐重?那就事與愿違了腔召。

所以在這個(gè)例子里, 也是存在兩維抽象的。一是"門"這個(gè)類型的抽象扮惦,二是"造門"這個(gè)方法的抽象臀蛛。簡(jiǎn)單工廠只做到了前者,而沒有給出后者的解決方案,這才造成了客戶可能吃了啞巴虧浊仆。

如果我們按照工廠方法的思路客峭,將門工廠造門這件事進(jìn)行細(xì)分,木門交給木門工廠抡柿,鐵門交給鐵門工廠舔琅。這就和工廠方法里的例子別無二致了≈蘖樱客戶需要先指定委托對(duì)象备蚓,而不關(guān)心具體怎么造門。

簡(jiǎn)單工廠和抽象工廠有啥區(qū)別囱稽?

依然可以用維度來理解抽象工廠郊尝。 抽象工廠比工廠方法又多了一維。

例子中战惊,抽象工廠提供了兩套“類型 - 創(chuàng)建操作”(分別是"門 - 造門"流昏,"專業(yè)人員 - 提供專業(yè)人員"),其實(shí)這個(gè)個(gè)數(shù)是無限的吞获。

你可以提供 n 套這樣的對(duì)應(yīng)關(guān)系况凉,然后委托給相關(guān)的工廠。這就是“工廠們的工廠”的具體含義衫哥。

參考資料
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茎刚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撤逢,更是在濱河造成了極大的恐慌膛锭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊荣,死亡現(xiàn)場(chǎng)離奇詭異初狰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)互例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門奢入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人媳叨,你說我怎么就攤上這事腥光。” “怎么了糊秆?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵武福,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我痘番,道長(zhǎng)捉片,這世上最難降的妖魔是什么平痰? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮伍纫,結(jié)果婚禮上宗雇,老公的妹妹穿的比我還像新娘。我一直安慰自己莹规,他們只是感情好赔蒲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著访惜,像睡著了一般嘹履。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上债热,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天砾嫉,我揣著相機(jī)與錄音,去河邊找鬼窒篱。 笑死焕刮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墙杯。 我是一名探鬼主播配并,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼高镐!你這毒婦竟也來了溉旋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤嫉髓,失蹤者是張志新(化名)和其女友劉穎观腊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算行,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梧油,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了州邢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡陨。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖量淌,靈堂內(nèi)的尸體忽然破棺而出骗村,到底是詐尸還是另有隱情,我是刑警寧澤呀枢,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布叙身,位于F島的核電站,受9級(jí)特大地震影響硫狞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一残吩、第九天 我趴在偏房一處隱蔽的房頂上張望财忽。 院中可真熱鬧,春花似錦泣侮、人聲如沸即彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隶校。三九已至,卻和暖如春蛹锰,著一層夾襖步出監(jiān)牢的瞬間深胳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工铜犬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舞终,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓癣猾,卻偏偏與公主長(zhǎng)得像敛劝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纷宇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 什么是簡(jiǎn)單工廠模式夸盟? 簡(jiǎn)單工廠模式主要包含三部分: 工廠類:根據(jù)外界的需求,決定創(chuàng)建并返回哪個(gè)具體的抽象子類像捶。 抽...
    小小納蘭閱讀 219評(píng)論 0 0
  • 設(shè)計(jì)模式-簡(jiǎn)單工廠設(shè)計(jì)模式 簡(jiǎn)單計(jì)算機(jī)計(jì)算程序 在上面程序中: 優(yōu)化后 接口定義,提供getResult方法,進(jìn)行...
    yangxuan閱讀 400評(píng)論 0 1
  • 一開始看書作岖,的確是因?yàn)樾麄髯龅姆浅:盟衾髞砹私獾筋愃茽I銷之類的評(píng)論,有些悵然痘儡,不過辕万,讀書,各取所需罷了沉删。 擺渡人渐尿,...
    New_Riland閱讀 243評(píng)論 0 0
  • 今天又一個(gè)父親節(jié),感覺與往年真的有所不同矾瑰,仔細(xì)品位朋友圈砖茸,你會(huì)發(fā)現(xiàn)感人的故事多了,親情的氛圍濃厚了殴穴。短短的幾年時(shí)間...
    周四清閱讀 332評(píng)論 0 1
  • 細(xì)看她含苞待放,守望她嬌艷如常.
    愛妃給朕笑一個(gè)閱讀 133評(píng)論 0 0