首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式實戰:Builder 模式完整實作與解析

     編輯:關於C語言

什麼是 Builder 模式?

Builder(建造者)模式屬於創建型模式,核心意圖是 「將複雜物件的建構過程與其表示分離」,使相同的建構流程能產出不同的表示。適用於:物件包含多個組件、建構步驟順序固定但細節多變、需支援多種產品組合的場景。

角色結構

  • Product(產品): Computer —— 最終要建構的複雜物件。
  • Builder(抽象建造者): 定義建構步驟介面(BuildCpu(), BuildRam())。
  • ConcreteBuilder(具體建造者): MacBuilder, PcBuilder —— 實作具體組件裝配邏輯。
  • Director(指揮者): Worker —— 控制建構順序,與具體建造者解耦。
  • Client(客戶端): 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();
        }
    }
}

關鍵點解析

  1. 封裝建構細節:Client 只需知道「要建什麼電腦」,不需知道 CPU/RAM 如何組裝。
  2. 開放封閉原則:新增 GamingLaptopBuilder 只需繼承 Builder,無須修改 Worker 或 Computer。
  3. 步驟順序集中控制:Worker.Construct() 保證 CPU 先於 RAM 裝配,避免 Client 調用順序錯誤。
  4. 靈活替換表示:同一建構流程,透過不同 Builder 產出 Mac / PC / Server 等差異產品。

進階變體:Fluent Builder(鏈式呼叫)

現代 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?

  • ✅ 物件擁有「多個可選組件」或「複雜初始化邏輯」。
  • ✅ 需支援「多種預設組合」(如:辦公型、遊戲型、工作站型)。
  • ✅ 建構過程需「步驟順序固定」或「驗證完整性」。
  • ❌ 簡單 DTO、屬性少於 3-4 個、無條件建構邏輯 —— 直接用建構子或物件初始化器即可。

Builder 模式讓「複雜物件的誕生」變得有序、可擴充、易測試,是領域模型豐富時的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved