設(shè)計(jì)模式 Day03 工廠三兄弟

1. 如何判斷你已經(jīng)掌握了某種設(shè)計(jì)模式?(非常重要)
  • ① 這個(gè)模式的意圖是什么而姐?它解決了什么問題炊邦、什么時(shí)候可以使用它
  • ② 它是如何解決的?掌握它的結(jié)構(gòu)圖狼渊,記住它的關(guān)鍵代碼
  • ③ 至少能夠想到它的兩個(gè)應(yīng)用實(shí)例箱熬,一個(gè)生活中的类垦,一個(gè)軟件中的
  • ④ 這個(gè)模式的缺點(diǎn)是什么?在使用時(shí)要注意什么

一城须、簡(jiǎn)單工廠模式

1. 這個(gè)模式的意圖是什么蚤认?它解決了什么問題、什么時(shí)候可以使用它
  • 什么時(shí)候使用它:
  • ① 當(dāng)一個(gè)產(chǎn)品的創(chuàng)建過(guò)程比較復(fù)雜糕伐,而使用者不必關(guān)心砰琢,
  • ② 并且使用者傳入不同參數(shù),能拿到不同產(chǎn)品實(shí)例對(duì)象時(shí)使用(達(dá)到創(chuàng)建和使用分離的效果)
2. 它是如何解決的良瞧?掌握它的結(jié)構(gòu)圖陪汽,記住它的關(guān)鍵代碼
  • 結(jié)構(gòu)圖:ConcreteFactory(具體工廠角色)、Product(抽象產(chǎn)品角色)褥蚯、ConcreteProduct(具體產(chǎn)品角色)
  • 關(guān)鍵代碼:ConcreteFactory 里面有個(gè)靜態(tài)方法挚冤,用 if-else 語(yǔ)法來(lái) 根據(jù)用戶傳入的參數(shù),獲取具體的對(duì)象
3. 至少能夠想到它的兩個(gè)應(yīng)用實(shí)例遵岩,一個(gè)軟件中的你辣,一個(gè)生活中的
  • 軟件中:圖表展示頁(yè)面,調(diào)用 ConcreteFactory 靜態(tài)方法尘执,傳入?yún)?shù)舍哄,可根據(jù)參數(shù)獲得餅圖、直方圖誊锭、折線圖等等
  • 生活中:暫時(shí)未想到
4. 這個(gè)模式的確定是什么表悬?在使用時(shí)要注意什么
  • 缺點(diǎn):
  • ① 當(dāng)返回的類型多的情況下,ConcreteFactory 的靜態(tài)方法將變得臃腫丧靡,并且難以維護(hù)
  • ② 當(dāng)有一個(gè)新的圖形蟆沫,比如環(huán)形圖要加入時(shí),需要修改 ConcreteFactory 的靜態(tài)方法温治,不符合軟件設(shè)計(jì)原則中的開閉原則
  • ③ 所有的產(chǎn)品實(shí)例都依賴于一個(gè) ConcreteFactory饭庞,一旦 ConcreteFactory 不能工作,影響將會(huì)非常大

二熬荆、工廠方法模式

1. 這個(gè)模式的意圖是什么舟山?它解決了什么問題、什么時(shí)候可以使用它
  • 解決了什么問題:
  • ① 解決了簡(jiǎn)單工廠模式中卤恳,增加新產(chǎn)品類型時(shí)累盗,不符合開閉設(shè)計(jì)原則的問題
  • ② 解決了簡(jiǎn)單工廠模式中,過(guò)多的產(chǎn)品類型時(shí)突琳,ConcreteFactory 的靜態(tài)方法會(huì)變得十分臃腫的問題
2. 它是如何解決的若债?掌握它的結(jié)構(gòu)圖,記住它的關(guān)鍵代碼
  • 結(jié)構(gòu)圖:Factory(抽象工廠角色)拆融、ConcreteFactory(具體工廠角色)蠢琳、Product(抽象產(chǎn)品角色)啊终、ConcreteProduct(具體產(chǎn)品角色)
  • 關(guān)鍵代碼:一個(gè) 具體工廠角色 對(duì)應(yīng)生產(chǎn)一種 具體產(chǎn)品角色 ;工廠和產(chǎn)品都有抽象類
3. 至少能夠想到它的兩個(gè)應(yīng)用實(shí)例挪凑,一個(gè)軟件中的孕索,一個(gè)生活中的
  • 軟件中:日志輸出工具類的編寫:可能輸出到文件中、可能輸出到數(shù)據(jù)庫(kù)中(未來(lái)可能擴(kuò)展輸出到阿里云中)
  • 生活中:待補(bǔ)充
4. 這個(gè)模式的缺點(diǎn)是什么躏碳?在使用時(shí)要注意什么
  • 缺點(diǎn):
  • ① 工廠方法模式中一個(gè)工廠對(duì)應(yīng)一類產(chǎn)品搞旭,很容易導(dǎo)致系統(tǒng)中存在大量的工廠類,勢(shì)必會(huì)增加系統(tǒng)的開銷
  • ② 使用工廠方法模式會(huì)增加類的數(shù)量菇绵,從而增加代碼理解的難度

三肄渗、抽象工廠模式

1. 這個(gè)模式的意圖是什么?它解決了什么問題咬最、什么時(shí)候可以使用它
  • 它解決了什么問題:
  • 它解決了工廠方法中存在的問題翎嫡,每個(gè)工廠只生產(chǎn)一類產(chǎn)品,可能導(dǎo)致系統(tǒng)中存在大量的工廠類永乌,增加程序復(fù)雜度和系統(tǒng)開銷
  • 什么時(shí)候可以使用它:
  • 當(dāng)一個(gè)工廠等級(jí)結(jié)構(gòu)可以創(chuàng)建出屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中所有對(duì)象時(shí)惑申,抽象工廠模式比工廠方法模式更為簡(jiǎn)單、更有效率翅雏。
  • 抽象工廠模式與工廠方法模式最大的區(qū)別在于:
  • 工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)圈驼,而抽象工廠模式需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),一個(gè)工廠等級(jí)結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建望几。
圖 3 產(chǎn)品族與產(chǎn)品等級(jí)結(jié)構(gòu)示意圖
  • 在圖 3 中绩脆,不同顏色的多個(gè)正方形、圓形和橢圓形分別構(gòu)成了三個(gè)不同的產(chǎn)品等級(jí)結(jié)構(gòu)
  • 而相同顏色的正方形橄抹、圓形和橢圓形構(gòu)成了一個(gè)產(chǎn)品族
  • 每個(gè)形狀對(duì)象都位于某個(gè)產(chǎn)品族靴迫,并屬于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)
圖 4 抽象工廠模式示意圖
  • 每個(gè)具體工廠可以生產(chǎn)屬于一個(gè)產(chǎn)品族中的所有產(chǎn)品,例如生產(chǎn)顏色相同的正方形楼誓、圓形和橢圓形玉锌,所生產(chǎn)的產(chǎn)品又位于不同的產(chǎn)品等級(jí)結(jié)構(gòu)中。
  • 如果使用工廠方法模式疟羹,圖 4 所示結(jié)構(gòu)需要提供 15 個(gè)具體工廠主守,而使用抽象工廠模式只需要提供 5 個(gè)具體工廠,極大減少了系統(tǒng)中類的個(gè)數(shù)阁猜。
2. 它是如何解決的丸逸?掌握它的結(jié)構(gòu)圖蹋艺,記住它的關(guān)鍵代碼
  • 結(jié)構(gòu)圖:
  • AbstractFactory(抽象工廠):它聲明了一組用于創(chuàng)建一族產(chǎn)品的方法剃袍,每一個(gè)方法對(duì)應(yīng)一種產(chǎn)品。
  • ConcreteFactory(具體工廠):它實(shí)現(xiàn)了再抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法捎谨,生產(chǎn)一組具體產(chǎn)品民效,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族憔维,每個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中
  • AbstractProduct(抽象產(chǎn)品): 它為每種產(chǎn)品聲明接口,在抽象產(chǎn)品中聲明了產(chǎn)品所具有的業(yè)務(wù)方法畏邢。
  • ConcreteProduct(具體產(chǎn)品):它定義了具體工廠生產(chǎn)的具體產(chǎn)品對(duì)象业扒,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法谒臼。
  • 關(guān)鍵代碼:
  • 抽象工廠角色:
abstract class AbstractFactory {
public abstract AbstractProductA createProductA(); //工廠方法一
public abstract AbstractProductB createProductB(); //工廠方法二
……
}
  • 具體工廠角色
class ConcreteFactory1 extends AbstractFactory {
    //工廠方法一
public AbstractProductA createProductA() {
    return new ConcreteProductA1();
}
 
//工廠方法二
public AbstractProductB createProductB() {
    return new ConcreteProductB1();
}
 
……
}
3. 至少能夠想到它的兩個(gè)應(yīng)用實(shí)例秀睛,一個(gè)生活中的,一個(gè)軟件中的
  • 軟件中的:換皮膚體系(可以由用戶下載皮膚包辽剧,然后直接更換系統(tǒng)內(nèi)的皮膚風(fēng)格)
  • 生活中的:待思考
4. 這個(gè)模式的缺點(diǎn)是什么臂寝?在使用時(shí)要注意什么
  • 缺點(diǎn):
  • 對(duì)于新增產(chǎn)品等級(jí)結(jié)構(gòu)是不符合開閉原則的
  • 優(yōu)點(diǎn):
  • 對(duì)于新增產(chǎn)品族是符合開閉原則的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末章鲤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咆贬,更是在濱河造成了極大的恐慌败徊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏缎,死亡現(xiàn)場(chǎng)離奇詭異皱蹦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)眷蜈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門沪哺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人端蛆,你說(shuō)我怎么就攤上這事凤粗。” “怎么了今豆?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵嫌拣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呆躲,道長(zhǎng)异逐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任插掂,我火速辦了婚禮灰瞻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辅甥。我一直安慰自己酝润,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布璃弄。 她就那樣靜靜地躺著要销,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夏块。 梳的紋絲不亂的頭發(fā)上疏咐,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天纤掸,我揣著相機(jī)與錄音,去河邊找鬼浑塞。 笑死借跪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酌壕。 我是一名探鬼主播掏愁,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卵牍!你這毒婦竟也來(lái)了托猩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辽慕,失蹤者是張志新(化名)和其女友劉穎京腥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溅蛉,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡公浪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了船侧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欠气。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镜撩,靈堂內(nèi)的尸體忽然破棺而出预柒,到底是詐尸還是另有隱情,我是刑警寧澤袁梗,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布宜鸯,位于F島的核電站,受9級(jí)特大地震影響遮怜,放射性物質(zhì)發(fā)生泄漏淋袖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一锯梁、第九天 我趴在偏房一處隱蔽的房頂上張望即碗。 院中可真熱鬧,春花似錦陌凳、人聲如沸剥懒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)初橘。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壁却,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工裸准, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留展东,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓炒俱,卻偏偏與公主長(zhǎng)得像盐肃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子权悟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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