第8章 建造者模式
內(nèi)容來自尚硅谷Java設(shè)計(jì)模式(圖解+框架源碼剖析)_嗶哩嗶哩_bilibili
寫在前面:本文內(nèi)容大致和原視頻內(nèi)老師的筆記內(nèi)容相同,會偶爾插入自己的注釋和理解,盡量會完成作業(yè)
兄弟們!加油!學(xué)就完事了!奧里給!
8.1蓋房項(xiàng)目需求
1)????? 需要建房子:這一過程為打樁、砌墻、封頂
2)????? 房子有各種各樣的,比如普通房,高樓,別墅,各種房子的過程雖然一樣,但是要求不要相同的.
3)????? 請編寫程序,完成需求.
?
8.2傳統(tǒng)方武解決蓋房需求
1)????? 思路分析(圖解)

2)????? 看老師代碼的演示
8.3傳統(tǒng)方式的問題分析
1)????? 優(yōu)點(diǎn)是比較好理解,簡單易操作。
2)????? 設(shè)計(jì)的程序結(jié)構(gòu),過于簡單,沒有設(shè)計(jì)緩存層對象,程序的擴(kuò)展和維護(hù)不好.也就是說,這種設(shè)計(jì)方案,把產(chǎn)品(即:房子)和創(chuàng)建產(chǎn)品的過程(即:建房子流程)封裝在一起,耦合性增強(qiáng)了。
3)????? 解決方案:將產(chǎn)品和產(chǎn)品建造過程解耦=>建造者模式.
8.4建造者模式的基本介紹
1)????? 建造者模式(Builder Pattern)又叫生成器模式,是一種對象構(gòu)建模式。它可以將復(fù)雜對象的建造過程抽象出來(抽象類別),使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。
2)????? 建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
8.5建造者模式的4個(gè)核心角色
1)????? Product(產(chǎn)品角色):一個(gè)具體的產(chǎn)品對象。
2)????? Builder(抽象建造者):創(chuàng)建一個(gè)Product對象的各個(gè)部件指定的接口/抽象類。
3)????? ConcreteBuilder(具體建造者):實(shí)現(xiàn)接口,構(gòu)建和裝配各個(gè)部件。
4)????? Director(指揮者):構(gòu)建一個(gè)使用Builder接口的對象。它主要是用于創(chuàng)建一個(gè)復(fù)雜的對象。它主要有兩個(gè)作用,一是:隔離了客戶與對象的生產(chǎn)過程,二是:負(fù)責(zé)控制產(chǎn)品對象的生產(chǎn)過程。
8.6建造者模式原理類圖

8.7建造者模式解決蓋房需求應(yīng)用實(shí)例
1)????? 需要建房子:這一過程為打樁、砌墻、封頂。不管是普通房子也好,別墅也好都需要經(jīng)歷這些過程,下面我們使用建造者模式(Builder Pattern)來完成
2)????? 思路分析圖解(類圖)

3)????? 代碼實(shí)現(xiàn)
8.8建造者模式在JDK的應(yīng)用和源碼分析
1)????? java.lang.StringBuilder中的建造者模式
2)????? 代碼說明+Debug源碼

3)????? 源碼中建造者模式的角色分析
ü? Appendable接口定義了多個(gè)Append方法(抽象方法),即Appendable為抽象建造者,定義了抽象方法
ü? AbstractStringBuilder 實(shí)現(xiàn)了Appendable接口方法,這里的 AbstractStringBuilder已經(jīng)是建造者,只是不能實(shí)例化
ü? StringBuilder 即充當(dāng)了指揮者角色,同時(shí)充當(dāng)了具體的建造者,建造方法的實(shí)現(xiàn)是由AbstractStringBuilder完成,而StringBuilder繼承了AbstractStringBuilder
8.9建造者模式細(xì)節(jié)
1)????? 客戶端(使用程序)不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象
2)????? 每一個(gè)具體建造者都相對獨(dú)立,而與其他的具體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象
3)????? 可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程。將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便使用程序來控制創(chuàng)建過程
4)????? 增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統(tǒng)擴(kuò)展方便,符合“開閉原則”
5)????? 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。
6)????? 如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大,因此在這種情況下,要考慮是否選擇建造者模式.
7)????? 抽象工廠模式vs建造者模式
抽象工廠模式實(shí)現(xiàn)對產(chǎn)品家族的創(chuàng)建,一個(gè)產(chǎn)品家族是這樣的一系列產(chǎn)品:具有不同分類維度的產(chǎn)品組合,采用抽象工廠模式不需要關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品由什么工廠生產(chǎn)即可。而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品