建造者模式將複雜對象的構建過程與其表示分離,使相同構建流程能創建不同表示。關鍵在於「分步構建」與「流程控制」。
| 維度 | 建造者模式 | 抽象工廠模式 |
|---|---|---|
| 關注點 | 零件類型、裝配順序、構建步驟 | 產品族、多系列產品創建 |
| 產品返回時機 | 最後一步才返回完整產品 | 立即返回產品 |
| 核心角色 | Director(指揮者)控制流程 | Factory 直接創建 |
// 1. 抽象建造者
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
}
// 2. 具體建造者 A
public class BuilderImpl implements Builder {
public void buildPartA() { System.out.println("構建部件 A"); }
public void buildPartB() { System.out.println("構建部件 B"); }
public void buildPartC() { System.out.println("構建部件 C"); }
}
// 3. 具體建造者 B(不同實現)
public class BuilderImpl2 implements Builder {
public void buildPartA() { System.out.println("構建部件 AA"); }
public void buildPartB() { System.out.println("構建部件 BB"); }
public void buildPartC() { System.out.println("構建部件 CC"); }
}
// 4. 指揮者:定義構建流程
public class Director {
private Builder builder;
public Director(Builder b) { builder = b; }
public void construct() {
System.out.println("Director 指揮構建流程 1");
builder.buildPartA(); builder.buildPartB(); builder.buildPartC();
}
}
// 5. 另一指揮者:不同構建順序
public class Director2 {
private Builder builder;
public Director2(Builder b) { builder = b; }
public void construct() {
System.out.println("Director2 指揮構建流程 2");
builder.buildPartB(); builder.buildPartC(); builder.buildPartA();
}
}
// 6. 客戶端測試
public class Test {
public static void main(String[] args) {
// 流程1 + 實現A
new Director(new BuilderImpl()).construct();
System.out.println();
// 流程1 + 實現B
new Director(new BuilderImpl2()).construct();
System.out.println();
// 流程2 + 實現B
new Director2(new BuilderImpl2()).construct();
}
}
Director 指揮構建流程 1 構建部件 A 構建部件 B 構建部件 C Director 指揮構建流程 1 構建部件 AA 構建部件 BB 構建部件 CC Director2 指揮構建流程 2 構建部件 BB 構建部件 CC 構建部件 AA
每種產品變體需對應一個 ConcreteBuilder,類別數量增加。