後端開發 設計模式 · 第 6 / 24 篇

建造者模式:一步步完成複雜任務

建造者模式 (Builder Pattern) 將複雜物件的建構過程與表示分離。透過 C# 三明治點餐範例,學習如何一步步構建複雜物件。

哈囉各位朋友們~今天我們繼續設計模式之旅,來聊聊 建造者模式(Builder) 吧!

🌟 建造者模式是什麼?

簡單地說,建造者模式就是將一個複雜產品的建構過程拆分成幾個獨立的步驟,然後逐步組裝起來。

你可以想像去 Subway 點三明治:店員會一步一步詢問你想加什麼食材,麵包種類、起司、蔬菜、醬料……最後做出你最愛的那個獨特三明治。這個點餐流程就有點像建造者模式的概念。

透過建造者模式,你可以有系統地建立出不同組合的複雜產品,並且輕鬆管理每一個步驟。


🤔 什麼時候要用建造者模式?

  • 產品建立過程複雜,有許多可變步驟或選項。
  • 想要明確區分物件的構建步驟與產出的物件。
  • 未來可能會新增更多的建構方式,但不想更動產品本身。

🥪 C# 建造者模式範例

我們就用「三明治店」當作實際範例,讓你馬上理解這個模式吧!

🥖 首先定義產品類別

using System;
using System.Collections.Generic;

/// <summary>
/// 三明治產品
/// </summary>
public class Sandwich
{
    /// <summary>
    /// 麵包種類
    /// </summary>
    public string Bread { get; set; }

    /// <summary>
    /// 起司種類
    /// </summary>
    public string Cheese { get; set; }

    /// <summary>
    /// 蔬菜配料
    /// </summary>
    public List<string> Veggies { get; set; } = new List<string>();

    /// <summary>
    /// 醬料
    /// </summary>
    public string Sauce { get; set; }

    /// <summary>
    /// 顯示三明治內容
    /// </summary>
    public void Display()
    {
        Console.WriteLine($"三明治配料:麵包({Bread})、起司({Cheese})、蔬菜({string.Join(", ", Veggies)})");
    }
}

🔨 建立建造者介面

/// <summary>
/// 建造者介面
/// </summary>
public interface ISandwichBuilder
{
    /// <summary>
    /// 添加麵包
    /// </summary>
    void AddBread();

    /// <summary>
    /// 添加起司
    /// </summary>
    void AddCheese();

    /// <summary>
    /// 添加蔬菜
    /// </summary>
    void AddVeggies();

    /// <summary>
    /// 取得完成的三明治
    /// </summary>
    Sandwich GetSandwich();
}

👨‍🍳 實作具體建造者

/// <summary>
/// 義大利風味三明治建造者
/// </summary>
public class ItalianSandwichBuilder : ISandwichBuilder
{
    private Sandwich _sandwich = new Sandwich();

    public void AddBread() => _sandwich.Bread = "義大利麵包";
    public void AddCheese() => _sandwich.Cheese = "莫札瑞拉起司";
    public void AddVeggies() => _sandwich.Veggies = new List<string> { "番茄", "羅勒", "洋蔥" };

    public Sandwich GetSandwich() => _sandwich;
}

/// <summary>
/// 素食三明治建造者
/// </summary>
public class VeggieSandwichBuilder : ISandwichBuilder
{
    private Sandwich _sandwich = new Sandwich();

    public void AddBread() => _sandwich.Bread = "全麥麵包";
    public void AddCheese() => _sandwich.Cheese = "素食起司";
    public void AddVeggies() => _sandwich.Veggies = new List<string> { "生菜", "番茄", "小黃瓜" };

    public Sandwich GetSandwich() => _sandwich;
}

👷 實作指揮者 (Director)

/// <summary>
/// 指揮者,負責掌控建造過程
/// </summary>
public class SandwichDirector
{
    public Sandwich Construct(ISandwichBuilder builder)
    {
        builder.AddBread();
        builder.AddCheese();
        builder.AddVeggies();
        return builder.GetSandwich();
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        var director = new SandwichDirector();

        // 製作義式三明治
        var italianBuilder = new ItalianSandwichBuilder();
        var italianSandwich = director.Construct(italianBuilder);
        italianSandwich.Display();

        // 製作素食三明治
        var veggieBuilder = new VeggieSandwichBuilder();
        var veggieSandwich = director.Construct(veggieBuilder);
        veggieSandwich.Display();
    }
}

🎯 執行結果

三明治配料:麵包(義大利麵包)、起司(莫札瑞拉起司)、蔬菜(番茄, 羅勒, 洋蔥)
三明治配料:麵包(全麥麵包)、起司(素食起司)、蔬菜(生菜, 番茄, 小黃瓜)

⚠️ 建造者模式小提醒

  • 優點:易於維護,建構物件的過程與表示分離,提升程式碼彈性。
  • 缺點:可能導致類別數量增加,使用時需衡量必要性。

🎉 結語

現在你又掌握了一個強大的模式—建造者模式(Builder)!透過這個模式,你能更方便地建立複雜、多樣化的物件。

繼續期待後面的設計模式介紹,喜歡的話記得收藏和分享喔~ 下篇再見啦!

系列:

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

設計模式

這篇是系列中的第 6 / 24 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 搞懂設計模式到底是什麼?
  2. 02 單例模式:只要一個就夠!
  3. 03 工廠方法模式:點披薩不用親自下廚
  4. 04 抽象工廠模式:系列產品輕鬆生產
  5. 05 原型模式:複製的藝術
  6. 06 建造者模式:一步步完成複雜任務 目前閱讀
  7. 07 介面卡模式:讓不相容也能合作
  8. 08 橋接模式:抽象與實作分離
  9. 09 組合模式:樹狀結構的好幫手
  10. 10 裝飾者模式:讓功能自由加點
  11. 11 外觀模式:化繁為簡
  12. 12 享元模式:節省記憶體的利器
  13. 13 代理模式:控制存取的守門員
  14. 14 責任鏈模式:層層把關的處理機制
  15. 15 命令模式:靈活封裝的請求指令
  16. 16 解譯器模式:讓程式聽懂你的指令
  17. 17 迭代器模式:輕鬆遍歷集合元素
  18. 18 中介者模式:管理複雜溝通的好幫手
  19. 19 備忘錄模式:保存與恢復物件狀態
  20. 20 觀察者模式:即時通知的好幫手
  21. 21 狀態模式:依狀態改變行為的祕訣
  22. 22 策略模式:靈活切換行為的好幫手
  23. 23 模板方法模式:固定流程靈活實作
  24. 24 訪問者模式:新增功能不動既有架構

Further reading

中介者模式:管理複雜溝通的好幫手 封面圖 2025-06-13 中介者模式:管理複雜溝通的好幫手 備忘錄模式:保存與恢復物件狀態 封面圖 2025-06-13 備忘錄模式:保存與恢復物件狀態 模板方法模式:固定流程靈活實作 封面圖 2025-06-13 模板方法模式:固定流程靈活實作

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 3 分鐘

本篇所在系列 · 第 6 / 24 篇

設計模式

  1. 搞懂設計模式到底是什麼?
  2. 單例模式:只要一個就夠!
  3. 工廠方法模式:點披薩不用親自下廚
  4. 抽象工廠模式:系列產品輕鬆生產
  5. 原型模式:複製的藝術
  6. 建造者模式:一步步完成複雜任務
  7. 介面卡模式:讓不相容也能合作
  8. 橋接模式:抽象與實作分離
  9. 組合模式:樹狀結構的好幫手
  10. 裝飾者模式:讓功能自由加點
  11. 外觀模式:化繁為簡
  12. 享元模式:節省記憶體的利器
  13. 代理模式:控制存取的守門員
  14. 責任鏈模式:層層把關的處理機制
  15. 命令模式:靈活封裝的請求指令
  16. 解譯器模式:讓程式聽懂你的指令
  17. 迭代器模式:輕鬆遍歷集合元素
  18. 中介者模式:管理複雜溝通的好幫手
  19. 備忘錄模式:保存與恢復物件狀態
  20. 觀察者模式:即時通知的好幫手
  21. 狀態模式:依狀態改變行為的祕訣
  22. 策略模式:靈活切換行為的好幫手
  23. 模板方法模式:固定流程靈活實作
  24. 訪問者模式:新增功能不動既有架構
看完整系列 24 篇