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

工廠方法模式:點披薩不用親自下廚

工廠方法模式 (Factory Method) 讓你將物件建立邏輯封裝起來。透過 C# 披薩工廠範例,學習如何讓程式碼更具彈性與可維護性。

哈囉大家,接續上一次 Singleton 模式,這一次我們要介紹的是另一個超實用的模式:工廠方法模式(Factory Method)。

別看到「工廠」兩個字就開始緊張,其實它超簡單!讓我們先來個輕鬆的比喻吧:

假設你今天去一家披薩店,店員跟你說:「告訴我你想吃什麼披薩,我們後面的廚師就會幫你做出來!」你不用在意披薩到底怎麼做,反正店家會處理好所有製作細節。這樣,你只要說出你想要的東西,剩下的交給專業的工廠就行。

這就是「工廠方法模式」的核心精神啦!


🤔 工廠方法模式什麼時候派得上用場?

當你遇到以下狀況時,就可以考慮使用工廠方法模式:

  • 你有多種類似的物件需要建立,但你不想每次都自己指定具體的類別。
  • 你想要簡化物件的建立過程,並且統一管理物件的生成邏輯。
  • 你想要未來可以輕鬆新增不同類型的物件,而不需要大幅修改現有的程式碼。

C# 工廠方法模式實作範例

這次我們就以「披薩店」作為具體的案例,示範如何使用工廠方法模式:

🍕 首先,定義產品介面

/// <summary>
/// 披薩產品介面
/// </summary>
public interface IPizza
{
    /// <summary>
    /// 準備食材
    /// </summary>
    void Prepare();

    /// <summary>
    /// 烘烤披薩
    /// </summary>
    void Bake();

    /// <summary>
    /// 切割披薩
    /// </summary>
    void Cut();

    /// <summary>
    /// 裝盒披薩
    /// </summary>
    void Box();
}

🧑‍🍳 建立具體的產品類別

using System;

/// <summary>
/// 起司披薩
/// </summary>
public class CheesePizza : IPizza
{
    public void Prepare() => Console.WriteLine("準備起司披薩的食材");
    public void Bake() => Console.WriteLine("烤製起司披薩中");
    public void Cut() => Console.WriteLine("切割起司披薩");
    public void Box() => Console.WriteLine("起司披薩裝盒完成");
}

/// <summary>
/// 海鮮披薩
/// </summary>
public class SeafoodPizza : IPizza
{
    public void Prepare() => Console.WriteLine("準備海鮮披薩的食材");
    public void Bake() => Console.WriteLine("烤製海鮮披薩中");
    public void Cut() => Console.WriteLine("切割海鮮披薩");
    public void Box() => Console.WriteLine("海鮮披薩裝盒完成");
}

🏭 定義工廠方法類別

/// <summary>
/// 披薩工廠介面
/// </summary>
public interface IPizzaFactory
{
    /// <summary>
    /// 建立披薩
    /// </summary>
    IPizza CreatePizza();
}

/// <summary>
/// 起司披薩工廠
/// </summary>
public class CheesePizzaFactory : IPizzaFactory
{
    public IPizza CreatePizza() => new CheesePizza();
}

/// <summary>
/// 海鮮披薩工廠
/// </summary>
public class SeafoodPizzaFactory : IPizzaFactory
{
    public IPizza CreatePizza() => new SeafoodPizza();
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 顧客點了一個起司披薩
        IPizzaFactory cheeseFactory = new CheesePizzaFactory();
        IPizza cheesePizza = cheeseFactory.CreatePizza();
        cheesePizza.Prepare();
        cheesePizza.Bake();
        cheesePizza.Cut();
        cheesePizza.Box();

        Console.WriteLine();

        // 顧客點了一個海鮮披薩
        IPizzaFactory seafoodFactory = new SeafoodPizzaFactory();
        IPizza seafoodPizza = seafoodFactory.CreatePizza();
        seafoodPizza.Prepare();
        seafoodPizza.Bake();
        seafoodPizza.Cut();
        seafoodPizza.Box();
    }
}

🎯 執行結果

準備起司披薩的食材
烤製起司披薩中
切割起司披薩
起司披薩裝盒完成

準備海鮮披薩的食材
烤製海鮮披薩中
切割海鮮披薩
海鮮披薩裝盒完成

⚠️ 工廠方法模式的小提醒

  • 工廠方法讓程式碼擴充性更強,但可能增加了一些額外的類別。
  • 當物件類型不多或固定時,不一定要使用工廠方法模式,以免過度設計。

結語

恭喜你,第二個設計模式也輕鬆入袋啦!透過工廠方法模式,我們把製造細節藏起來,專心點餐就好!

接下來,我們會繼續介紹更多設計模式,每篇文章一樣用輕鬆有趣的方式帶你深入理解,而且所有程式碼範例也都會在 GitHub 上公開。

喜歡的話記得追蹤一下,有問題隨時留言告訴我,下次見!

系列:

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

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

還有疑問

Learning path

設計模式

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

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