工廠模式

場景問題

  舉個生活中常見的例子——組裝電腦尚辑,我們在組裝電腦的時候,通常需要選擇一系列的配件盔腔,比如CPU杠茬、硬盤、內(nèi)存弛随、主板瓢喉、電源、機箱等舀透。為討論使用簡單點栓票,只考慮選擇CPU和主板的問題。

  事實上愕够,在選擇CPU的時候逗载,面臨一系列的問題,比如品牌链烈、型號、針腳數(shù)目挚躯、主頻等問題强衡,只有把這些問題都確定下來,才能確定具體的CPU码荔。

  同樣漩勤,在選擇主板的時候,也有一系列問題缩搅,比如品牌越败、芯片組、集成芯片硼瓣、總線頻率等問題究飞,也只有這些都確定了置谦,才能確定具體的主板。

  選擇不同的CPU和主板亿傅,是每個客戶在組裝電腦的時候媒峡,向裝機公司提出的要求,也就是我們每個人自己擬定的裝機方案葵擎。

  在最終確定這個裝機方案之前谅阿,還需要整體考慮各個配件之間的兼容性。比如:CPU和主板酬滤,如果使用Intel的CPU和AMD的主板是根本無法組裝的签餐。因為Intel的CPU針腳數(shù)與AMD主板提供的CPU插口不兼容,就是說如果使用Intel的CPU根本就插不到AMD的主板中盯串,所以裝機方案是整體性的氯檐,里面選擇的各個配件之間是有關(guān)聯(lián)的。

  對于裝機工程師而言嘴脾,他只知道組裝一臺電腦男摧,需要相應(yīng)的配件,但是具體使用什么樣的配件译打,還得由客戶說了算耗拓。也就是說裝機工程師只是負責(zé)組裝,而客戶負責(zé)選擇裝配所需要的具體的配件奏司。因此乔询,當(dāng)裝機工程師為不同的客戶組裝電腦時,只需要根據(jù)客戶的裝機方案韵洋,去獲取相應(yīng)的配件竿刁,然后組裝即可。



使用簡單工廠模式的解決方案

  考慮客戶的功能搪缨,需要選擇自己需要的CPU和主板食拜,然后告訴裝機工程師自己的選擇,接下來就等著裝機工程師組裝電腦了副编。

  對裝機工程師而言负甸,只是知道CPU和主板的接口,而不知道具體實現(xiàn)痹届,很明顯可以用上簡單工廠模式或工廠方法模式呻待。為了簡單,這里選用簡單工廠队腐〔献剑客戶告訴裝機工程師自己的選擇,然后裝機工程師會通過相應(yīng)的工廠去獲取相應(yīng)的實例對象柴淘。




cpu接口:

主板接口:










上面的實現(xiàn)迫淹,雖然通過簡單工廠方法解決了:對于裝機工程師秘通,只知CPU和主板的接口,而不知道具體實現(xiàn)的問題千绪。但還有一個問題沒有解決充易,那就是這些CPU對象和主板對象其實是有關(guān)系的,需要相互匹配的荸型。而上面的實現(xiàn)中盹靴,并沒有維護這種關(guān)聯(lián)關(guān)系,CPU和主板是由客戶任意選擇瑞妇,這是有問題的稿静。比如在客戶端調(diào)用makeComputer時,傳入?yún)?shù)為(1,2)辕狰,運行結(jié)果如下:


觀察上面結(jié)果就會看出問題改备。客戶選擇的是Intel的CPU針腳數(shù)為755蔓倍,而選擇的主板是AMD悬钳,主板上的CPU插孔是938,根本無法組裝偶翅,這就是沒有維護配件之間的關(guān)系造成的默勾。該怎么解決這個問題呢?

引進抽象工廠模式

  每一個模式都是針對一定問題的解決方案聚谁。抽象工廠模式與工廠方法模式的最大區(qū)別就在于母剥,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu);而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)形导。

 在學(xué)習(xí)抽象工廠具體實例之前环疼,應(yīng)該明白兩個重要的概念:產(chǎn)品族和產(chǎn)品等級。

  所謂產(chǎn)品族朵耕,是指位于不同產(chǎn)品等級結(jié)構(gòu)中炫隶,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如AMD的主板阎曹、芯片組伪阶、CPU組成一個家族,Intel的主板芬膝、芯片組、CPU組成一個家族形娇。而這兩個家族都來自于三個產(chǎn)品等級:主板锰霜、芯片組、CPU桐早。一個等級結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成癣缅,示意圖如下:


 顯然厨剪,每一個產(chǎn)品族中含有產(chǎn)品的數(shù)目,與產(chǎn)品等級結(jié)構(gòu)的數(shù)目是相等的友存。產(chǎn)品的等級結(jié)構(gòu)與產(chǎn)品族將產(chǎn)品按照不同方向劃分祷膳,形成一個二維的坐標系。橫軸表示產(chǎn)品的等級結(jié)構(gòu)屡立,縱軸表示產(chǎn)品族直晨,上圖共有兩個產(chǎn)品族,分布于三個不同的產(chǎn)品等級結(jié)構(gòu)中膨俐。只要指明一個產(chǎn)品所處的產(chǎn)品族以及它所屬的等級結(jié)構(gòu)勇皇,就可以唯一的確定這個產(chǎn)品。

 上面所給出的三個不同的等級結(jié)構(gòu)具有平行的結(jié)構(gòu)焚刺。因此敛摘,如果采用工廠方法模式,就勢必要使用三個獨立的工廠等級結(jié)構(gòu)來對付這三個產(chǎn)品等級結(jié)構(gòu)乳愉。由于這三個產(chǎn)品等級結(jié)構(gòu)的相似性兄淫,會導(dǎo)致三個平行的工廠等級結(jié)構(gòu)。隨著產(chǎn)品等級結(jié)構(gòu)的數(shù)目的增加蔓姚,工廠方法模式所給出的工廠等級結(jié)構(gòu)的數(shù)目也會隨之增加捕虽。如下圖:


那么,是否可以使用同一個工廠等級結(jié)構(gòu)來對付這些相同或者極為相似的產(chǎn)品等級結(jié)構(gòu)呢赂乐?當(dāng)然可以的薯鳍,而且這就是抽象工廠模式的好處。同一個工廠等級結(jié)構(gòu)負責(zé)三個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建挨措。


 可以看出挖滤,一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象。顯然浅役,這時候抽象工廠模式比簡單工廠模式斩松、工廠方法模式更有效率。對應(yīng)于每一個產(chǎn)品族都有一個具體工廠觉既。而每一個具體工廠負責(zé)創(chuàng)建屬于同一個產(chǎn)品族惧盹,但是分屬于不同等級結(jié)構(gòu)的產(chǎn)品。

抽象工廠模式結(jié)構(gòu)

  抽象工廠模式是對象的創(chuàng)建模式瞪讼,它是工廠方法模式的進一步推廣钧椰。

  假設(shè)一個子系統(tǒng)需要一些產(chǎn)品對象,而這些產(chǎn)品又屬于一個以上的產(chǎn)品等級結(jié)構(gòu)符欠。那么為了將消費這些產(chǎn)品對象的責(zé)任和創(chuàng)建這些產(chǎn)品對象的責(zé)任分割開來嫡霞,可以引進抽象工廠模式。這樣的話希柿,消費產(chǎn)品的一方不需要直接參與產(chǎn)品的創(chuàng)建工作诊沪,而只需要向一個公用的工廠接口請求所需要的產(chǎn)品养筒。

  通過使用抽象工廠模式,可以處理具有相同(或者相似)等級結(jié)構(gòu)中的多個產(chǎn)品族中的產(chǎn)品對象的創(chuàng)建問題端姚。如下圖所示:


由于這兩個產(chǎn)品族的等級結(jié)構(gòu)相同晕粪,因此使用同一個工廠族也可以處理這兩個產(chǎn)品族的創(chuàng)建問題,這就是抽象工廠模式渐裸∥紫妫  根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖,就不難給出工廠角色的結(jié)構(gòu)設(shè)計圖橄仆。


 可以看出剩膘,每一個工廠角色都有兩個工廠方法,分別負責(zé)創(chuàng)建分屬不同產(chǎn)品等級結(jié)構(gòu)的產(chǎn)品對象盆顾。



源代碼

  前面示例實現(xiàn)的CPU接口和CPU實現(xiàn)對象怠褐,主板接口和主板實現(xiàn)對象,都不需要變化您宪。

前面示例中創(chuàng)建CPU的簡單工廠和創(chuàng)建主板的簡單工廠奈懒,都不再需要秋冰。

  新加入的抽象工廠類和實現(xiàn)類:


 裝機工程師類跟前面的實現(xiàn)相比救欧,主要的變化是:從客戶端不再傳入選擇CPU和主板的參數(shù),而是直接傳入客戶已經(jīng)選擇好的產(chǎn)品對象庇楞。這樣就避免了單獨去選擇CPU和主板所帶來的兼容性問題捏卓,客戶要選就是一套极祸,就是一個系列。


  抽象工廠的功能是為一系列相關(guān)對象或相互依賴的對象創(chuàng)建一個接口怠晴。一定要注意遥金,這個接口內(nèi)的方法不是任意堆砌的,而是一系列相關(guān)或相互依賴的方法蒜田。比如上面例子中的主板和CPU稿械,都是為了組裝一臺電腦的相關(guān)對象。不同的裝機方案冲粤,代表一種具體的電腦系列美莫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梯捕,隨后出現(xiàn)的幾起案子厢呵,更是在濱河造成了極大的恐慌,老刑警劉巖傀顾,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件襟铭,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機蝌矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來错英,“玉大人入撒,你說我怎么就攤上這事⊥盅遥” “怎么了茅逮?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長判哥。 經(jīng)常有香客問我献雅,道長,這世上最難降的妖魔是什么塌计? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任挺身,我火速辦了婚禮,結(jié)果婚禮上锌仅,老公的妹妹穿的比我還像新娘章钾。我一直安慰自己,他們只是感情好热芹,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布贱傀。 她就那樣靜靜地躺著,像睡著了一般伊脓。 火紅的嫁衣襯著肌膚如雪府寒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天报腔,我揣著相機與錄音株搔,去河邊找鬼。 笑死榄笙,一個胖子當(dāng)著我的面吹牛邪狞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茅撞,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼帆卓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了米丘?” 一聲冷哼從身側(cè)響起剑令,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拄查,沒想到半個月后吁津,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年碍脏,在試婚紗的時候發(fā)現(xiàn)自己被綠了梭依。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡典尾,死狀恐怖役拴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钾埂,我是刑警寧澤河闰,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站褥紫,受9級特大地震影響姜性,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓考,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一部念、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氨菇,春花似錦印机、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奶是,卻和暖如春楣责,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聂沙。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工秆麸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人及汉。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓沮趣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坷随。 傳聞我的和親對象是個殘疾皇子房铭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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