工廠模式解決「創建什麼」,建造者模式(Builder Pattern)解決「如何一步步構建」。當物件擁有複雜內部結構、多個構成部件、且構建順序固定但部件實作多變時,建造者模式大放異彩:將一個複雜物件的構建與其表示分離,使得相同的構建過程可以創建不同的表示(GoF)。

public class Food {
private Hashtable _items = new Hashtable();
public void Add(string name, string price) => _items.Add(name, price);
public void Show() {
Console.WriteLine("Food List:\n------------------------------");
foreach (DictionaryEntry item in _items)
Console.WriteLine($"{item.Key}:\t{item.Value}");
Console.WriteLine("------------------------------");
}
}
public abstract class Builder {
public abstract void BuildHamburger();
public abstract void BuildCoke();
public abstract void BuildChips();
public abstract Food GetResult();
}
public class NormalBuilder : Builder {
private Food _food = new Food();
public override void BuildHamburger() => _food.Add("NormalHamburger", "¥10.50");
public override void BuildCoke() => _food.Add("Coke", "¥4.50");
public override void BuildChips() => _food.Add("Chips", "¥2.00");
public override Food GetResult() => _food;
}
public class GoldBuilder : Builder {
private Food _food = new Food();
public override void BuildHamburger() => _food.Add("GoldHamburger", "¥13.50");
public override void BuildCoke() => _food.Add("Coke", "¥4.50");
public override void BuildChips() => _food.Add("Chips", "¥3.50");
public override Food GetResult() => _food;
}
public class FoodManager {
public void Construct(Builder builder) {
builder.BuildHamburger(); // 步驟 1
builder.BuildCoke(); // 步驟 2
builder.BuildChips(); // 步驟 3(算法固定不變)
}
}

public class Client {
public static void Main() {
var manager = new FoodManager();
Console.Write("Enter Food No (1=Normal, 2=Gold): ");
string no = Console.ReadLine();
string builderType = ConfigurationManager.AppSettings["No" + no]; // "NormalBuilder" 或 "GoldBuilder"
Builder builder = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + builderType);
manager.Construct(builder);
Food food = builder.GetResult();
food.Show();
}
}

GoF 指出可根據複雜度簡化:

builder.Construct() 
StringBuilder) 
public interface IHouse {
bool HasBackyard { get; }
long RoomCount { get; }
string Description { get; }
}
public class Apartment : IHouse { /* 無後院、3 房 */ }
public class SingleFamilyHome : IHouse { /* 有後院、5 房 */ }
public class Director {
public IHouse BuildHouse(bool hasBackyard)
=> hasBackyard ? new SingleFamilyHome() : new Apartment();
}
此例中導演者直接實例化產品(簡化版建造者),展示「導演者知悉算法、建造者實作細節」的核心分工。
Append 系列方法構建字串,ToString() 獲取結果.Uri 產出Expression.Block、Expression.Lambda 等構建邏輯樹UseMiddleware 鏈式構建中介軟體管線| 模式 | 關注點 | 核心角色 | 典型場景 |
|---|---|---|---|
| 工廠方法 | 單一物件創建 | Factory + Product | 單一服務實現切換 |
| 抽象工廠 | 系列物件創建 | Factory Family + Product Family | UI 主題、跨平台 Provider |
| 建造者 | 複雜物件分步構建 | Director + Builder + Product | 文檔生成、複雜物件圖、配置物件 |
關鍵差異:建造者強調「構建過程(算法)」,抽象工廠強調「產品族一致性」,工廠方法強調「單一物件延遲綁定」。
this,支援鏈式呼叫 builder.SetA().SetB().Build()以下情況適用建造者模式:
建造者模式的本質是「解耦構建演算法與部件實作」。導演者知道「做什麼、按什麼順序」,建造者知道「怎麼做具體步驟」,產品只是結果承載者。這種分離讓系統在面對「新增部件類型」、「調整構建順序」、「替換整個產品表示」等變化時,都能從容應對。從 StringBuilder 到 ASP.NET Core 中介軟體管線,建造者模式是構建複雜物件圖的基石藝術。