Builder(建造者)模式屬於創建型模式,核心意圖是 「將複雜物件的建構過程與其表示分離」,使相同的建構流程能產出不同的表示。適用於:物件包含多個組件、建構步驟順序固定但細節多變、需支援多種產品組合的場景。
Computer —— 最終要建構的複雜物件。BuildCpu(), BuildRam())。MacBuilder, PcBuilder —— 實作具體組件裝配邏輯。Worker —— 控制建構順序,與具體建造者解耦。CEO.Main() —— 建立具體建造者與指揮者,啟動建構。using System;
using System.Collections;
namespace BuilderPatternDemo
{
// ==================== Product ====================
public class Computer
{
public string Type { get; }
private readonly Hashtable _parts = new Hashtable();
public Computer(string type)
{
Type = type;
Console.WriteLine($"Computer [{type}] is being built...");
}
public string this[string key]
{
get => (string)_parts[key];
set => _parts[key] = value;
}
public void Show()
{
Console.WriteLine($"=== {Type} Specification ===");
Console.WriteLine($"CPU : {this["cpu"]}");
Console.WriteLine($"RAM : {this["ram"]}");
Console.WriteLine("============================");
}
}
// ==================== Abstract Builder ====================
public abstract class Builder
{
protected Computer Computer { get; }
protected Builder(string type) => Computer = new Computer(type);
public abstract void BuildCpu();
public abstract void BuildRam();
}
// ==================== Concrete Builders ====================
public class MacBuilder : Builder
{
public MacBuilder(string type) : base(type) { }
public override void BuildCpu() => Computer["cpu"] = "Apple M3 Pro";
public override void BuildRam() => Computer["ram"] = "18GB Unified Memory";
}
public class PcBuilder : Builder
{
public PcBuilder(string type) : base(type) { }
public override void BuildCpu() => Computer["cpu"] = "Intel Core i9-14900K";
public override void BuildRam() => Computer["ram"] = "64GB DDR5 6000MHz";
}
// ==================== Director ====================
public class Worker
{
public void Construct(Builder builder)
{
builder.BuildCpu();
builder.BuildRam();
// 可擴充:builder.BuildGpu(); builder.BuildStorage(); ...
}
}
// ==================== Client ====================
public class Program
{
public static void Main()
{
var worker = new Worker();
var macBuilder = new MacBuilder("MacBook Pro 16");
worker.Construct(macBuilder);
macBuilder.Computer.Show();
var pcBuilder = new PcBuilder("Custom Gaming PC");
worker.Construct(pcBuilder);
pcBuilder.Computer.Show();
}
}
}
GamingLaptopBuilder 只需繼承 Builder,無須修改 Worker 或 Computer。Worker.Construct() 保證 CPU 先於 RAM 裝配,避免 Client 調用順序錯誤。現代 C# 常採用 Fluent API 風格,省去 Director,直接鏈式配置:
public class ComputerBuilder
{
private readonly Computer _computer = new Computer("Custom");
public ComputerBuilder SetCpu(string cpu) { _computer["cpu"] = cpu; return this; }
public ComputerBuilder SetRam(string ram) { _computer["ram"] = ram; return this; }
public Computer Build() => _computer;
}
// 使用
var computer = new ComputerBuilder()
.SetCpu("AMD Ryzen 9 7950X")
.SetRam("128GB DDR5")
.Build();
Builder 模式讓「複雜物件的誕生」變得有序、可擴充、易測試,是領域模型豐富時的利器。