前言
設(shè)計模式系列代碼均持續(xù)更新在我的gitHub:to github
I. 定義
- 建造者模式,又稱生成器模式,是一種對象構(gòu)建模式。它可以將復(fù)雜對象的建造過程抽象出來,既相同的部位和布局,可以構(gòu)建出不同的表現(xiàn)形式。例如: 每個用戶的博客空間布局都是類似的,但每個用戶所發(fā)的文章不同。
優(yōu)點
- 逐步構(gòu)建復(fù)雜對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的細節(jié)。[即封裝性好]
例如我們?nèi)ベ徺I電腦。我們可以靈活選擇不同的cpu、顯卡型號,最后只要指定一個型號,就可以交由商家去組裝電腦。
- 擴展性好,各個具體的建造者相互獨立,有利于系統(tǒng)的解耦。
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),建造者可以對創(chuàng)建過程逐步細化,而不對其它模塊產(chǎn)生任何影響,便于控制細節(jié)風(fēng)險。
缺點
- 產(chǎn)品型號可以不同,但是組成部分的類型必須相同,[你總不能把內(nèi)存條插到放硬盤的地方吧] 這限制了其使用范圍
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜,如果產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護成本較大。
II. 建造者模式的四大角色
- Product - 具體的產(chǎn)品對象
- Builder - 抽象創(chuàng)造者,指定各個部件的 接口/抽象類
- ConcreteBuilder - 具體建造者,實現(xiàn)接口,構(gòu)建和裝配各個具體部件
- Director - 指揮者,構(gòu)建一個使用Builder接口的對象。主要作用是創(chuàng)建一個復(fù)雜對象。同時隔離客戶與對象的生產(chǎn)過程。負責(zé)控制產(chǎn)品對象的生產(chǎn)過程。
III. 建造者模式的類圖

類間關(guān)系描述
- ComputerBuilder 構(gòu)建者抽象
- Computer 產(chǎn)品類型
- Computer_v1 / Computer_v2 具體構(gòu)建者。代表不同類型的電腦
- Director 指揮者
- Client 客戶
執(zhí)行邏輯: 客戶給指揮者發(fā)送一個電腦類型,指揮者交由具體構(gòu)建者執(zhí)行,然后由抽象構(gòu)建者的builderComputer()方法返回一個Computer實例。
IV. 來人,上代碼!
- Computer
/**
* Product - 產(chǎn)品類型
* 省略 get/set/constructor */
public class Computer {
/* 以下屬性也可以是引用類型, 僅使用普通變量做演示 */
private String cpu; // cpu 型號
private String gpu; // 顯卡型號
private String ram; // 運行內(nèi)存大小
private String rom; // 存儲內(nèi)存大小
- ComputerBuilder
public abstract class ComputerBuilder {
protected Computer computer = new Computer();
public abstract void setCPU();
public abstract void setGPU();
public abstract void setRAM();
public abstract void setROM();
public Computer buildComputer() {return this.computer; }
}
- Computer_v1
public class Computer_v1 extends ComputerBuilder {
@Override
public void setCPU() {
this.computer.setCpu("i5-*");
}
@Override
public void setGPU() {
this.computer.setGpu("GTX 980");
}
@Override
public void setRAM() {
this.computer.setRam("8g");
}
@Override
public void setROM() {
this.computer.setRom("固態(tài)-無,機械-1T");
}
}
- Computer_v2
package builder;
public class Computer_v2 extends ComputerBuilder {
@Override
public void setCPU() {
this.computer.setCpu("i9-*");
}
@Override
public void setGPU() {
this.computer.setGpu("RTX 3090");
}
@Override
public void setRAM() {
this.computer.setRam("16G");
}
@Override
public void setROM() {
this.computer.setRom("固態(tài)-256G,機械-1T");
}
}
- Director
public class Director {
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
/* 如果我要換一個方案,則只需SET,無需再new */
public void setComputerBuilder(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public Computer constructComputer() {
/* 構(gòu)建順序如下 */
this.computerBuilder.setCPU();
this.computerBuilder.setGPU();
this.computerBuilder.setRAM();
this.computerBuilder.setROM();
return this.computerBuilder.buildComputer();
}
}
- Client
public class Client {
public static void main(String[] args) {
/* 構(gòu)建一臺低配電腦 */
Computer_v1 computer_v1 = new Computer_v1();
Director director = new Director(computer_v1);
Computer myComputer = director.constructComputer();
System.out.println("myComputer => " + myComputer);
/* 使用set換一個構(gòu)建方式 */
Computer_v2 computer_v2 = new Computer_v2();
director.setComputerBuilder(computer_v2);
Computer myDream = director.constructComputer();
System.out.println("my Dream Computer => " + myDream);
}
}
-
控制臺結(jié)果
運行結(jié)果
