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)品族是符合開閉原則的