前言
今天Carson來(lái)全面總結(jié)最常用的設(shè)計(jì)模式 - 建造者模式。
其他設(shè)計(jì)模式介紹
這是一份全面 & 詳細(xì)的設(shè)計(jì)模式學(xué)習(xí)指南
Carson帶你學(xué)設(shè)計(jì)模式:?jiǎn)卫J剑⊿ingleton)
Carson帶你學(xué)設(shè)計(jì)模式:簡(jiǎn)單工廠模式(SimpleFactoryPattern)
Carson帶你學(xué)設(shè)計(jì)模式:工廠方法模式(Factory Method)
Carson帶你學(xué)設(shè)計(jì)模式:抽象工廠模式(Abstract Factory)
Carson帶你學(xué)設(shè)計(jì)模式:策略模式(Strategy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:適配器模式(Adapter Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:靜態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:動(dòng)態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:模板方法模式(Template Method)
Carson帶你學(xué)設(shè)計(jì)模式:建造者模式(Builder Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:外觀模式(Facade Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:觀察者模式(Observer)
目錄
1. 簡(jiǎn)介
1.1 模式說(shuō)明
隱藏創(chuàng)建對(duì)象的建造過(guò)程 & 細(xì)節(jié),使得用戶在不知對(duì)象的建造過(guò)程 & 細(xì)節(jié)的情況下,就可直接創(chuàng)建復(fù)雜的對(duì)象
- 用戶只需要給出指定復(fù)雜對(duì)象的類型和內(nèi)容;
- 建造者模式負(fù)責(zé)按順序創(chuàng)建復(fù)雜對(duì)象(把內(nèi)部的建造過(guò)程和細(xì)節(jié)隱藏起來(lái))
1.2 作用(解決的問(wèn)題)
- 降低創(chuàng)建復(fù)雜對(duì)象的復(fù)雜度
- 隔離了創(chuàng)建對(duì)象的構(gòu)建過(guò)程 & 表示
從而:
- 方便用戶創(chuàng)建復(fù)雜的對(duì)象(不需要知道實(shí)現(xiàn)過(guò)程)
- 代碼復(fù)用性 & 封裝性(將對(duì)象構(gòu)建過(guò)程和細(xì)節(jié)進(jìn)行封裝 & 復(fù)用)
例子:造汽車 & 買(mǎi)汽車。
- 工廠(建造者模式):負(fù)責(zé)制造汽車(組裝過(guò)程和細(xì)節(jié)在工廠內(nèi))
- 汽車購(gòu)買(mǎi)者(用戶):你只需要說(shuō)出你需要的型號(hào)(對(duì)象的類型和內(nèi)容),然后直接購(gòu)買(mǎi)就可以使用了
(不需要知道汽車是怎么組裝的(車輪、車門(mén)、發(fā)動(dòng)機(jī)、方向盤(pán)等等))
2. 模式原理
2.1 UML類圖
2.2 模式講解
- 指揮者(Director)直接和客戶(Client)進(jìn)行需求溝通;
- 溝通后指揮者將客戶創(chuàng)建產(chǎn)品的需求劃分為各個(gè)部件的建造請(qǐng)求(Builder);
- 將各個(gè)部件的建造請(qǐng)求委派到具體的建造者(ConcreteBuilder);
- 各個(gè)具體建造者負(fù)責(zé)進(jìn)行產(chǎn)品部件的構(gòu)建;
- 最終構(gòu)建成具體產(chǎn)品(Product)。
3. 實(shí)例講解
接下來(lái)我用一個(gè)實(shí)例來(lái)對(duì)建造者模式進(jìn)行更深一步的介紹。
3.1 實(shí)例概況
- 背景
小成希望去電腦城買(mǎi)一臺(tái)組裝的臺(tái)式主機(jī) - 過(guò)程
- 電腦城老板(Diretor)和小成(Client)進(jìn)行需求溝通(買(mǎi)來(lái)打游戲?學(xué)習(xí)?看片?)
- 了解需求后,電腦城老板將小成需要的主機(jī)劃分為各個(gè)部件(Builder)的建造請(qǐng)求(CPU、主板blabla)
- 指揮裝機(jī)人員(ConcreteBuilder)去構(gòu)建組件;
- 將組件組裝起來(lái)成小成需要的電腦(Product)
3.2 使用步驟
步驟1:定義組裝的過(guò)程(Builder):組裝電腦的過(guò)程
public abstract class Builder {
//第一步:裝CPU
//聲明為抽象方法,具體由子類實(shí)現(xiàn)
public abstract void BuildCPU();
//第二步:裝主板
//聲明為抽象方法,具體由子類實(shí)現(xiàn)
public abstract void BuildMainboard();
//第三步:裝硬盤(pán)
//聲明為抽象方法,具體由子類實(shí)現(xiàn)
public abstract void BuildHD();
//返回產(chǎn)品的方法:獲得組裝好的電腦
public abstract Computer GetComputer();
}
步驟2: 電腦城老板委派任務(wù)給裝機(jī)人員(Director)
public class Director{
//指揮裝機(jī)人員組裝電腦
public void Construct(Builder builder){
builder. BuildCPU();
builder.BuildMainboard();
builder. BuildHD();
}
}
步驟3: 創(chuàng)建具體的建造者(ConcreteBuilder):裝機(jī)人員
//裝機(jī)人員1
public class ConcreteBuilder extend Builder{
//創(chuàng)建產(chǎn)品實(shí)例
Computer computer = new Computer();
//組裝產(chǎn)品
@Override
public void BuildCPU(){
computer.Add("組裝CPU")
}
@Override
public void BuildMainboard(){
computer.Add("組裝主板")
}
@Override
public void BuildHD(){
computer.Add("組裝主板")
}
//返回組裝成功的電腦
@Override
public Computer GetComputer(){
return computer
}
}
步驟4: 定義具體產(chǎn)品類(Product):電腦
public class Computer{
//電腦組件的集合
private List<String> parts = new ArrayList<String>();
//用于將組件組裝到電腦里
public void Add(String part){
parts.add(part);
}
public void Show(){
for (int i = 0;i<parts.size();i++){
System.out.println(“組件”+parts.get(i)+“裝好了”);
}
System.out.println(“電腦組裝完成,請(qǐng)驗(yàn)收”);
}
}
步驟5:客戶端調(diào)用-小成到電腦城找老板買(mǎi)電腦
public class Builder Pattern{
public static void main(String[] args){
//逛了很久終于發(fā)現(xiàn)一家合適的電腦店
//找到該店的老板和裝機(jī)人員
Director director = new Director();
Builder builder = new ConcreteBuilder();
//溝通需求后,老板叫裝機(jī)人員去裝電腦
director.Construct(builder);
//裝完后,組裝人員搬來(lái)組裝好的電腦
Computer computer = builder.GetComputer();
//組裝人員展示電腦給小成看
computer.Show();
}
}
結(jié)果輸出
組件CUP裝好了
組件主板裝好了
組件硬盤(pán)裝好了
電腦組裝完成,請(qǐng)驗(yàn)收
通過(guò)上述這個(gè)常見(jiàn)的生活例子,我相信你已經(jīng)完全明白了建造者模式的原理了!!
4. 特點(diǎn)
在全面解析完后,我來(lái)分析下其優(yōu)缺點(diǎn):
4.1 優(yōu)點(diǎn)
- 易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過(guò)程進(jìn)行解耦,可以使用相同的創(chuàng)建過(guò)程來(lái)得到不同的產(chǎn)品。也就說(shuō)細(xì)節(jié)依賴抽象。 - 易于精確控制對(duì)象的創(chuàng)建
將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過(guò)程更加清晰 - 易于拓展
增加新的具體建造者無(wú)需修改原有類庫(kù)的代碼,易于拓展,符合“開(kāi)閉原則“。
每一個(gè)具體建造者都相對(duì)獨(dú)立,而與其他的具體建造者無(wú)關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對(duì)象。
4.2 缺點(diǎn)
- 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會(huì)導(dǎo)致需要定義很多具體建造者類來(lái)實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。
5. 應(yīng)用場(chǎng)景
- 需要生成的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對(duì)象具備共性;
- 隔離復(fù)雜對(duì)象的創(chuàng)建和使用,并使得相同的創(chuàng)建過(guò)程可以創(chuàng)建不同的產(chǎn)品。
6. 總結(jié)
- 本文主要對(duì)建造者模式進(jìn)行了全面介紹
- 接下來(lái)我會(huì)對(duì)每種設(shè)計(jì)模式進(jìn)行詳細(xì)的分析,歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū),不定期分享關(guān)于安卓開(kāi)發(fā)的干貨,追求短、平、快,但卻不缺深度。
請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力!
相關(guān)文章閱讀
這是一份全面 & 詳細(xì)的設(shè)計(jì)模式學(xué)習(xí)指南
Carson帶你學(xué)設(shè)計(jì)模式:?jiǎn)卫J剑⊿ingleton)
Carson帶你學(xué)設(shè)計(jì)模式:簡(jiǎn)單工廠模式(SimpleFactoryPattern)
Carson帶你學(xué)設(shè)計(jì)模式:工廠方法模式(Factory Method)
Carson帶你學(xué)設(shè)計(jì)模式:抽象工廠模式(Abstract Factory)
Carson帶你學(xué)設(shè)計(jì)模式:策略模式(Strategy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:適配器模式(Adapter Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:靜態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:動(dòng)態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:模板方法模式(Template Method)
Carson帶你學(xué)設(shè)計(jì)模式:建造者模式(Builder Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:外觀模式(Facade Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:觀察者模式(Observer)