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

模板方法模式:固定流程靈活實作

模板方法模式 (Template Method Pattern) 定義演算法骨架,將細節留給子類別實作。本文透過 C# 披薩製作範例,教你如何固定流程並保留彈性。

哈囉朋友們~今天我們要介紹的是非常實用且常見的模板方法模式(Template Method),透過它你可以固定一系列的步驟,讓子類別靈活地去實現細節。

🌟 模板方法模式是什麼?

模板方法模式定義了一個演算法的骨架,並將一些步驟延遲到子類別去實現。這樣的設計可以確保演算法的結構保持一致,但又能靈活地調整細節。

例如,你在製作各種口味的披薩時,無論是海鮮披薩還是夏威夷披薩,都有一個基本的製作步驟(揉麵團、加醬料、放餡料、烤披薩)。模板方法模式就是把這個固定步驟封裝起來,讓子類別專注於實現每個細節。


🤔 什麼時候適合使用模板方法模式?

以下情況很適合使用模板方法模式:

  • 當你有一系列步驟,但每個步驟的具體實現可能會有所不同。
  • 想確保演算法的結構不被子類別改變,保證流程的統一性。
  • 希望提供一個明確的框架,讓開發者能快速實現不同的具體步驟。

🍕 C# 模板方法模式範例:披薩製作流程

這次我們以製作披薩的流程作為範例。

🍅 建立抽象類別

using System;

/// <summary>
/// 披薩製作抽象類別
/// </summary>
public abstract class PizzaMaker
{
    /// <summary>
    /// 製作披薩的流程
    /// </summary>
    public void MakePizza()
    {
        PrepareDough();
        AddSauce();
        AddToppings();
        BakePizza();
    }

    /// <summary>
    /// 準備麵團
    /// </summary>
    protected void PrepareDough()
    {
        Console.WriteLine("揉製麵團...");
    }

    /// <summary>
    /// 加入醬料
    /// </summary>
    protected void AddSauce()
    {
        Console.WriteLine("加入醬料...");
    }

    /// <summary>
    /// 加入配料,由子類別實作
    /// </summary>
    protected abstract void AddToppings();

    /// <summary>
    /// 烘烤披薩
    /// </summary>
    protected void BakePizza()
    {
        Console.WriteLine("烤製披薩...");
    }
}

🍍 建立具體子類別

/// <summary>
/// 夏威夷披薩
/// </summary>
public class HawaiianPizzaMaker : PizzaMaker
{
    /// <summary>
    /// 加入夏威夷披薩的配料
    /// </summary>
    protected override void AddToppings()
    {
        Console.WriteLine("加入鳳梨與火腿...");
    }
}

/// <summary>
/// 海鮮披薩
/// </summary>
public class SeafoodPizzaMaker : PizzaMaker
{
    /// <summary>
    /// 加入海鮮披薩的配料
    /// </summary>
    protected override void AddToppings()
    {
        Console.WriteLine("加入鮮蝦、章魚和起司...");
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        PizzaMaker hawaiianPizza = new HawaiianPizzaMaker();
        hawaiianPizza.MakePizza();

        Console.WriteLine();

        PizzaMaker seafoodPizza = new SeafoodPizzaMaker();
        seafoodPizza.MakePizza();
    }
}

🎯 執行結果

揉製麵團...
加入醬料...
加入鳳梨與火腿...
烤製披薩...

揉製麵團...
加入醬料...
加入鮮蝦、章魚和起司...
烤製披薩...

⚠️ 模板方法模式使用注意事項

  • 優點:能有效地重用程式碼,保證演算法結構一致,並能靈活擴充。
  • 缺點:當步驟太多時,抽象類別可能變得複雜,需謹慎設計。

🎉 結語

恭喜你掌握了模板方法模式(Template Method)!透過這個模式,你的程式可以更有條理,更易維護與擴充。

繼續追蹤我們的設計模式系列,下篇再見啦~

系列:

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

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

還有疑問

Learning path

設計模式

這篇是系列中的第 23 / 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 分鐘

本篇所在系列 · 第 23 / 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 篇