1. 簡介
1.1模式說明
隱藏創(chuàng)建對象的建造過程 & 細節(jié),使得用戶在不知對象的建造過程 & 細節(jié)的情況下,就可直接創(chuàng)建復雜的對象
- 用戶只需要給出指定復雜對象的類型和內(nèi)容;
- 建造者模式負責按順序創(chuàng)建復雜對象(把內(nèi)部的建造過程和細節(jié)隱藏起來)
1.2 作用(解決的問題)
- 降低創(chuàng)建復雜對象的復雜度
- 隔離了創(chuàng)建對象的構(gòu)建過程 & 表示
方便用戶創(chuàng)建復雜的對象(不需要知道實現(xiàn)過程)
代碼復用性 & 封裝性(將對象構(gòu)建過程和細節(jié)進行封裝 & 復用)
例子:造汽車 & 買汽車
工廠(建造者模式):負責制造汽車(組裝過程和細節(jié)在工廠內(nèi))
汽車購買者(用戶):你只需要說出你需要的型號(對象的類型和內(nèi)容),然后直接購買就可以使用了
(不需要知道汽車是怎么組裝的(車輪、車門、發(fā)動機、方向盤等等))
2. 模式原理
2.1 UML類圖

2.2 模式講解
- 指揮者(Director)直接和客戶(Client)進行需求溝通;
- 溝通后指揮者將客戶創(chuàng)建產(chǎn)品的需求劃分為各個部件的建造請求(Builder);
- 將各個部件的建造請求委派到具體的建造者(ConcreteBuilder);
- 各個具體建造者負責進行產(chǎn)品部件的構(gòu)建;
- 最終構(gòu)建成具體產(chǎn)品(Product)。
3. 實例講解
3.1 實例概況
背景
小成希望去電腦城買一臺組裝的臺式主機
過程
- 電腦城老板(Diretor)和小成(Client)進行需求溝通(買來打游戲?學習?看片?)
- 了解需求后,電腦城老板將小成需要的主機劃分為各個部件(Builder)的建造請求(CPU、主板blabla)
- 指揮裝機人員(ConcreteBuilder)去構(gòu)建組件;
- 將組件組裝起來成小成需要的電腦(Product)
3.2 使用步驟
步驟1:定義組裝的過程(Builder):組裝電腦的過程
public abstract class Builder {
//第一步:裝CPU
public abstract void buildCPU();
//裝主板
public abstract void buildMainboard();
//裝硬盤
public abstract void buildHD();
//返回產(chǎn)品的方法 獲取組裝好的電腦
public abstract Computer getComputer();
}
步驟2: 電腦城老板委派任務給裝機人員(Director)
public class Director {
/**
* //指揮裝機人員組裝電腦
* @param builder
*/
public void constract(Builder builder) {
builder.buildCPU();
builder.buildMainboard();
builder.buildHD();
}
}
步驟3: 創(chuàng)建具體的建造者(ConcreteBuilder):裝機人員
/**
* //裝機人員1
*/
public class ConcreteBuilder extends Builder {
//創(chuàng)建產(chǎn)品實例
Computer mComputer = new Computer();
@Override
public void buildCPU() {
mComputer.add("組裝CPU");
}
@Override
public void buildMainboard() {
mComputer.add("組裝主板");
}
@Override
public void buildHD() {
mComputer.add("組裝硬盤");
}
/**
* 返回組裝成功后的電腦
* @return
*/
@Override
public Computer getComputer() {
return mComputer;
}
}
步驟4: 定義具體產(chǎn)品類(Product):電腦
public class Computer {
//電腦組件的集合
private List<String> parts = new ArrayList<>();
//用于將組件組裝到電腦里
public void add(String part) {
parts.add(part);
}
public void show() {
for (int i = 0; i < parts.size(); i++) {
Log.e("===z","組件" + parts.get(i) + "組裝好了");
}
Log.e("===z","電腦組裝完成,請驗收");
}
}
步驟5:客戶端調(diào)用-小成到電腦城找老板買電腦
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Builder builder = new ConcreteBuilder();
Director director = new Director();
director.constract(builder);
Computer computer = builder.getComputer();
computer.show();
}
輸出結(jié)果:

4.優(yōu)缺點
優(yōu)點
易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進行解耦,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品。也就說細節(jié)依賴抽象。
易于精確控制對象的創(chuàng)建
將復雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰
易于拓展
增加新的具體建造者無需修改原有類庫的代碼,易于拓展,符合“開閉原則“
缺點
建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。
如果產(chǎn)品的內(nèi)部變化復雜,可能會導致需要定義很多具體建造者類來實現(xiàn)這種變化,導致系統(tǒng)變得很龐大
5.應用場景
- 需要生成的產(chǎn)品對象有復雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對象具備共性;
- 隔離復雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品。
OK 常用的設計模式到此結(jié)束 下期 我們講責任鏈模式