將一個複雜物件的建構與其表示分離,使相同的建構過程可創建不同的表示。
buildPartX()、getResult())。abstract class Computer {
protected abstract void installCpu();
protected abstract void installRam();
protected abstract void installStorage();
// 模板方法:預設組裝順序
public final Computer defaultBuild() {
installCpu(); installRam(); installStorage();
return this;
}
}
abstract class ComputerBuilder {
public abstract void buildPart();
public abstract Computer getComputer();
}
class OfficePC extends Computer {
protected void installCpu() { System.out.println("裝入 i5-13400"); }
protected void installRam() { System.out.println("裝入 16GB DDR4"); }
protected void installStorage() { System.out.println("裝入 512GB SSD"); }
}
class GamingPC extends Computer {
protected void installCpu() { System.out.println("裝入 i9-13900K"); }
protected void installRam() { System.out.println("裝入 32GB DDR5"); }
protected void installStorage() { System.out.println("裝入 2TB NVMe"); }
}
class OfficePCBuilder extends ComputerBuilder {
private OfficePC pc = new OfficePC();
public void buildPart() {
pc.installStorage(); // 先裝硬碟
pc.installCpu(); // 再裝 CPU
pc.installRam(); // 最後裝記憶體
}
public Computer getComputer() { return pc; }
}
class GamingPCBuilder extends ComputerBuilder {
private GamingPC pc = new GamingPC();
public void buildPart() {
pc.installRam(); // 客戶不要 SSD,省略 installStorage()
pc.installCpu();
}
public Computer getComputer() { return pc; }
}
class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder b) { builder = b; }
public Computer construct() {
builder.buildPart();
return builder.getComputer();
}
}
public class Client {
public static void main(String[] args) {
// 1. 使用預設模板組裝
Computer stdOffice = new OfficePC().defaultBuild();
// 2. 使用指揮者 + 具體建造者自訂組裝
Director dir = new Director(new GamingPCBuilder());
Computer customGaming = dir.construct();
}
}
| 模式 | 關注點 | 典型場景 |
|---|---|---|
| 簡單工廠/工廠方法 | 創建單一產品實例 | 根據類型返回對應對象 |
| 抽象工廠 | 創建產品族 | 跨平台 UI、多資料庫適配 |
| 建造者 | 分步驟組裝複雜物件,順序/部件可變 | 電腦組裝、報表生成、SQL 構建器 |
| 模板方法 | 定義演算法骨架,延遲步驟到子類 | 框架流程控制、預設組裝順序 |
本範例中 Computer.defaultBuild() 即模板方法;Director 類似抽象工廠但強調「建構過程」。
public class User {
private final String name;
private final int age;
private final String email;
private User(Builder b) {
this.name = b.name; this.age = b.age; this.email = b.email;
}
public static class Builder {
private String name; private int age; private String email;
public Builder name(String v) { name = v; return this; }
public Builder age(int v) { age = v; return this; }
public Builder email(String v) { email = v; return this; }
public User build() { return new User(this); }
}
}
// 使用
User u = new User.Builder().name("Tom").age(25).email("tom@ex.com").build();
此為流式建造者,無 Director,適合參數較多、順序固定的不可變物件建構。