結構性示範代碼
using System;
using System.Collections;
// 指導者
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
// 抽象建造者
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
// 具體建造者 1
class ConcreteBuilder1 : Builder
{
private Product product;
public override void BuildPartA()
{
product = new Product();
product.Add("PartA");
}
public override void BuildPartB() => product.Add("PartB");
public override Product GetResult() => product;
}
// 具體建造者 2
class ConcreteBuilder2 : Builder
{
private Product product;
public override void BuildPartA()
{
product = new Product();
product.Add("PartX");
}
public override void BuildPartB() => product.Add("PartY");
public override Product GetResult() => product;
}
// 產品
class Product
{
private ArrayList parts = new ArrayList();
public void Add(string part) => parts.Add(part);
public void Show()
{
Console.WriteLine(" Product Parts -------");
foreach (string p in parts) Console.WriteLine(p);
}
}
// 客戶端
public class Client
{
public static void Main()
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
}
}
執行結果
Product Parts -------
PartA
PartB
Product Parts -------
PartX
PartY
核心流程解析
- 客戶端建立
Director 與兩個 Builder
Director.Construct() 控制構建順序:A → B
- 各
Builder 實作具體構建邏輯
- 構建完成透過
GetResult() 取得產品
- 同一流程構建出不同內部結構的產品
關鍵設計點
Director **不依賴具體建造者**,僅依賴 Builder 抽象
- 構建順序集中在
Director,易於修改/擴展流程
Product 類別無建構知識,純粹資料容器
- 客戶端只需知道
Director 與 Builder,不知產品細節