當對象構建過程**復雜**、**步驟固定但細節可變**、或需**多種表示**時,將構建邏輯從業務代碼中分離。
Computer)buildCpu(), buildRam()... 及 getResult()
// 產品
class Computer {
String cpu, ram, storage, gpu;
@Override public String toString() {
return "Computer{cpu=" + cpu + ", ram=" + ram + ", storage=" + storage + ", gpu=" + gpu + "}";
}
}
// 抽象建造者
interface Builder {
void buildCpu();
void buildRam();
void buildStorage();
void buildGpu();
Computer getResult();
}
// 具體建造者:高端電腦
class HighEndBuilder implements Builder {
private Computer c = new Computer();
public void buildCpu() { c.cpu = "i9-13900K"; }
public void buildRam() { c.ram = "64GB DDR5"; }
public void buildStorage() { c.storage = "2TB NVMe"; }
public void buildGpu() { c.gpu = "RTX 4090"; }
public Computer getResult() { return c; }
}
// 導演者
class Director {
private Builder builder;
public Director(Builder builder) { this.builder = builder; }
public void construct() {
builder.buildCpu();
builder.buildRam();
builder.buildStorage();
builder.buildGpu();
}
}
// 客戶端
public class BuilderDemo {
public static void main(String[] args) {
Builder builder = new HighEndBuilder();
Director director = new Director(builder);
director.construct();
Computer pc = builder.getResult();
System.out.println(pc);
}
}
| 維度 | 工廠模式 | 建造者模式 |
|---|---|---|
| 關注點 | 創建**單個**對象 | 構建**復雜**對象的**過程** |
| 步驟 | 一次性完成 | 分步驟、可定制順序 |
| 導演者 | 無 | 有 (封裝構建算法) |
| 適用性 | 構建簡單、參數少 | 構建複雜、可選部件多、順序敏感 |
StringBuilder / StringBuffer (內部建造者)MimeMessage 構建Request.Builder)SqlSessionFactoryBuilder
Computer pc = new Computer.Builder()
.cpu("i7-13700K")
.ram("32GB")
.storage("1TB")
.gpu("RTX 4070")
.build();
此為 **Builder 模式變體**,省去 Director,適合步驟固定、可選參數多的場景。