軟件構(gòu)造|工廠方法模式與抽象工廠模式

模式(FactoryMethod)的定義:

? ? ? 定義一個創(chuàng)建產(chǎn)品對象的工廠接口蟀架,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當中罚攀。滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點庞溜。我們把被創(chuàng)建的對象稱為“產(chǎn)品”看杭,把創(chuàng)建產(chǎn)品的對象稱為“工廠”惭等。如果要創(chuàng)建的產(chǎn)品不多褒纲,只要一個工廠類就可以完成翁狐,這種模式叫“簡單工廠模式”类溢,它不屬于 GoF 的 23 種經(jīng)典設(shè)計模式,它的缺點是增加新產(chǎn)品時會違背“開閉原則”露懒。

模式的3種變體:

?? 簡單工廠模式: 允許接口創(chuàng)建對象闯冷,但不會暴露對象的創(chuàng)建邏輯。

?? 工廠方法模式:允許接口創(chuàng)建對象懈词,但使用哪個類來創(chuàng)建對象蛇耀,則是交由子類決定的。

?? 抽象工廠模式:抽象工廠是一個能夠創(chuàng)建一系列相關(guān)的對象而無需指定/公開其具體類的接口坎弯。該模式能夠提供其他工廠的對象蒂窒,在其內(nèi)部創(chuàng)建其他對象。



一荞怒、簡單工廠模式:

1.1定義

? ? ? 簡單工廠模式又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責(zé)創(chuàng)建其他類的實例洒琢,被創(chuàng)建的實例通常都具有共同的父類。該模式對對象創(chuàng)建管理方式最為簡單褐桌,因為其僅僅簡單的對不同類對象的創(chuàng)建進行了一層薄薄的封裝衰抑。 其UML類圖如下:

1.2類圖

類圖


1.3簡單工廠模式代碼

簡單工廠類:

簡單工廠類

客戶端代碼:

客戶端代碼

1.4簡單工廠模式的優(yōu)缺點

優(yōu)點:

??? 簡單工廠包含必要的判斷邏輯,簡單工廠實現(xiàn)了對象的創(chuàng)建和使用的分離荧嵌。

??? 客戶端無需知道所創(chuàng)建的具體產(chǎn)品類的類名呛踊,只需要具體產(chǎn)品類對應(yīng)的參數(shù)即可。

??? 在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類一定程度上提高了系統(tǒng)的靈活性啦撮。

缺點:

??? 工廠類的職責(zé)過重谭网,例如算術(shù)運算中簡單工廠中包含加減乘除的邏輯判斷語句,一旦它出現(xiàn)有問題赃春,整個系統(tǒng)都會出問題愉择。

??? 在添加新的類的時候,例如添加開根號運算那么簡單工廠類就要修改,違反了開放—封閉原則不利于系統(tǒng)的擴展和維護锥涕。

??? 簡單工廠的靜態(tài)方法衷戈,使得工廠角色無法形成基于繼承的等級結(jié)構(gòu)。



二层坠、工廠方法模式:?

2.1定義

工廠方法模式是對簡單工廠模式進一步的解耦殖妇,因為在工廠方法模式中是一個子類對應(yīng)一個工廠類,而這些工廠類都實現(xiàn)于一個抽象接口破花。工廠方法模式是一個用于創(chuàng)建對象的接口谦趣,讓子類決定實例化哪一個類。

? ? ? 注意事項:作為一種創(chuàng)建類模式座每,在任何需要生成復(fù)雜對象的地方蔚润,都可以使用工廠方法模式。有一點需要注意的地方就是復(fù)雜對象適合使用工廠模式尺栖,而簡單對象嫡纠,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式延赌。如果使用工廠模式除盏,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度挫以。

2.2類圖

類圖



2.3工廠模式代碼

定義一個工廠接口:

定義一個工廠接口

定義具體工廠類:

定義具體工廠類

客戶端代碼:

客戶端代碼

? ?? 工廠方法克服了簡單工廠的缺點者蠕,增加新的產(chǎn)品時,不必修改現(xiàn)存的代碼只需要增加新代碼即可掐松,滿足開放封閉原則踱侣。

2.3工廠方法的優(yōu)缺點

優(yōu)點:

?? 原來是自己創(chuàng)建對象(new),而現(xiàn)在可以直接通過工廠傳遞所需要的對象大磺。

?? 使用工廠模式易于功能擴展抡句,只需返回共有的父類對象(此對象是多態(tài)對象),而不對其他造成影響杠愧。

?? 遵循代碼開閉原則待榔。

?? 封裝性:對外只保留基類(所有產(chǎn)線共有特征類),具體實現(xiàn)交由工廠選擇流济。

缺點

? ? 假如某個具體產(chǎn)品類 需要進行一定的修改锐锣,很可能需要修改對應(yīng)的工廠類。當同時需要修改多個產(chǎn)品類的時候绳瘟,對工廠類的修改會變得特別麻煩雕憔。例如:每增加一個產(chǎn)品,相應(yīng)的也要增加一個子工廠糖声,會加大了額外的開發(fā)量斤彼。? ? ? ? ? ? ? ? ??



三分瘦、抽象工廠模式(Abstract Factory Pattern) :?

3.1定義

抽象工廠模式是一種為訪問類提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的不同等級的產(chǎn)品的模式結(jié)構(gòu)畅卓。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產(chǎn)一個等級的產(chǎn)品蟋恬,而抽象工廠模式可生產(chǎn)多個等級的產(chǎn)品翁潘。

3.2類圖

類圖

抽象工廠模式包含如下角色:

??? 抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心。

??? 具體工廠(Concrete Factory)角色:這個角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實例歼争。

??? 抽象產(chǎn)品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所創(chuàng)建的對象的父類拜马,或它們共同擁有的接口。

??? 具體產(chǎn)品(Concrete Product)角色:抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個具體產(chǎn)品類的實例沐绒。這是客戶端最終需要的東西俩莽。

3.3抽象工廠模式代碼

示例:

?? 例如:Q3和Q7有不同的輪胎、發(fā)動機乔遮、制動系統(tǒng)扮超。雖然生產(chǎn)的零件不同,型號不同蹋肮。但是根本上都有共同的約束出刷,就是輪胎、發(fā)動機坯辩、制動系統(tǒng)馁龟。設(shè)計如下:

1.需要一個抽象工廠,里面有三個接口分別為生產(chǎn)輪胎漆魔、發(fā)動機坷檩、制動系統(tǒng),抽象類

2.需要三個抽象產(chǎn)品分別為輪胎改抡、發(fā)動機矢炼、制動系統(tǒng)

3.需要實現(xiàn)上面的三個抽象類,定義出每個類不同的對象阿纤,比如:普通輪胎和越野輪胎

4.需要兩個具體類繼承自上面的抽象類裸删,實現(xiàn)具體的工廠,比如:生產(chǎn)Q3的工廠A和生產(chǎn)Q7的工廠B

5.在客戶端new出對應(yīng)的具體工廠并調(diào)用對應(yīng)的生產(chǎn)方法

1.抽象工廠:



2.根據(jù)抽象接口定義不同的對象:

3.實現(xiàn)具體的工廠類:

4.客戶端使用:

5.結(jié)果輸出:

結(jié)果輸出

3.4抽象工廠模式的優(yōu)缺點

抽象工廠模式的優(yōu)點:

? ? ?? 抽象工廠模式除了具有工廠方法模式的優(yōu)點外阵赠,最主要的優(yōu)點就是可以在類的內(nèi)部對產(chǎn)品族進行約束涯塔。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián)清蚀,抽象工廠模式就可以在類內(nèi)部對產(chǎn)品族的關(guān)聯(lián)關(guān)系進行定義和描述匕荸,而不必專門引入一個新的類來進行管理。

抽象工廠模式的缺點: ? ??

? ? ?? 產(chǎn)品族的擴展費力枷邪,假如產(chǎn)品族中需要增加一個新的產(chǎn)品榛搔,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產(chǎn)品等級結(jié)構(gòu)的劃分是非常重要的践惑。

3.5抽象工廠模式與工廠方法模式的區(qū)別

??? 抽象工廠模式是工廠方法模式的升級版本腹泌,他用來創(chuàng)建一組相關(guān)或者相互依賴的對象。他與工廠方法模式的區(qū)別就在于:工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu)尔觉;而抽象工廠模式則是針對的多個產(chǎn)品等級結(jié)構(gòu)凉袱。在編程中,通常一個產(chǎn)品結(jié)構(gòu)侦铜,表現(xiàn)為一個接口或者抽象類专甩,也就是說,工廠方法模式提供的所有產(chǎn)品都是衍生自同一個接口或抽象類钉稍,而抽象工廠模式所提供的產(chǎn)品則是衍生自不同的接口或抽象類涤躲。

??? 在抽象工廠模式中,有一個產(chǎn)品族的概念:所謂的產(chǎn)品族贡未,是指位于不同產(chǎn)品等級結(jié)構(gòu)中功能相關(guān)聯(lián)的產(chǎn)品組成的家族种樱。抽象工廠模式所提供的一系列產(chǎn)品就組成一個產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個等級結(jié)構(gòu)俊卤。我們依然拿生產(chǎn)汽車的例子來說明他們之間的區(qū)別缸托。

抽象工廠模式與工廠方法模式的區(qū)別







?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘾蛋,隨后出現(xiàn)的幾起案子俐镐,更是在濱河造成了極大的恐慌,老刑警劉巖哺哼,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩抹,死亡現(xiàn)場離奇詭異,居然都是意外死亡取董,警方通過查閱死者的電腦和手機棍苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茵汰,“玉大人枢里,你說我怎么就攤上這事□逦纾” “怎么了栏豺?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豆胸。 經(jīng)常有香客問我奥洼,道長,這世上最難降的妖魔是什么晚胡? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任灵奖,我火速辦了婚禮嚼沿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓷患。我一直安慰自己骡尽,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布擅编。 她就那樣靜靜地躺著攀细,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沙咏。 梳的紋絲不亂的頭發(fā)上辨图,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天班套,我揣著相機與錄音肢藐,去河邊找鬼。 笑死吱韭,一個胖子當著我的面吹牛吆豹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播理盆,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼痘煤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猿规?” 一聲冷哼從身側(cè)響起衷快,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姨俩,沒想到半個月后蘸拔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡环葵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年调窍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张遭。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡邓萨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菊卷,到底是詐尸還是另有隱情缔恳,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布洁闰,位于F島的核電站褐耳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渴庆。R本人自食惡果不足惜铃芦,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一雅镊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刃滓,春花似錦仁烹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砰诵,卻和暖如春征唬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茁彭。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工总寒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人理肺。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓摄闸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妹萨。 傳聞我的和親對象是個殘疾皇子年枕,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355