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

抽象工廠模式:系列產品輕鬆生產

抽象工廠模式 (Abstract Factory) 能協助你建立一系列相關或相依的物件。本文以 C# 家具工廠為例,教你如何輕鬆管理產品系列。

嗨各位朋友~前面我們介紹過了 Singleton 和 Factory Method,今天要繼續往下走,聊一個稍微進階一點點的設計模式:「抽象工廠模式(Abstract Factory)」。

🌟 什麼是抽象工廠模式?

簡單來說,抽象工廠模式就是提供一個介面,讓你可以建立一整系列相關的產品,而不需要關心產品具體的實作方式。

舉個例子,今天你到 IKEA 買家具,通常會想要一次買齊同一系列的產品,比如椅子、桌子、書架等等。如果這些家具都是同系列,外觀看起來會很搭調,品質和風格也會一致。這樣的一個系列產品,就是抽象工廠想幫你解決的問題!


🧐 抽象工廠模式適合什麼場景?

以下情境適合用抽象工廠模式解決:

  • 你的產品需要有不同的系列或主題,每個系列內又有多個相關產品。
  • 想要保證同系列產品之間能夠完美兼容。
  • 未來可能需要新增更多產品系列,而希望盡可能避免修改現有程式碼。

🛋️ C# 抽象工廠模式範例

這次,我們就用「家具工廠」作為範例來示範抽象工廠模式的實作吧!

1️⃣ 定義產品介面

/// <summary>
/// 椅子介面
/// </summary>
public interface IChair
{
    /// <summary>
    /// 坐在椅子上
    /// </summary>
    void SitOn();
}

/// <summary>
/// 桌子介面
/// </summary>
public interface ITable
{
    /// <summary>
    /// 使用桌子
    /// </summary>
    void Use();
}

🛋️ 建立具體產品(現代系列和古典系列)

using System;

/// <summary>
/// 現代風格椅子
/// </summary>
public class ModernChair : IChair
{
    public void SitOn() => Console.WriteLine("坐在現代風格的椅子上。");
}

/// <summary>
/// 現代風格桌子
/// </summary>
public class ModernTable : ITable
{
    public void Use() => Console.WriteLine("使用現代風格的桌子。");
}

/// <summary>
/// 古典風格椅子
/// </summary>
public class ClassicChair : IChair
{
    public void SitOn() => Console.WriteLine("坐在古典風格的椅子上。");
}

/// <summary>
/// 古典風格桌子
/// </summary>
public class ClassicTable : ITable
{
    public void Use() => Console.WriteLine("使用古典風格的桌子。");
}

🏭 建立抽象工廠與具體工廠

/// <summary>
/// 家具抽象工廠介面
/// </summary>
public interface IFurnitureFactory
{
    /// <summary>
    /// 建立椅子
    /// </summary>
    IChair CreateChair();

    /// <summary>
    /// 建立桌子
    /// </summary>
    ITable CreateTable();
}

/// <summary>
/// 現代風格家具工廠
/// </summary>
public class ModernFurnitureFactory : IFurnitureFactory
{
    public IChair CreateChair() => new ModernChair();
    public ITable CreateTable() => new ModernTable();
}

/// <summary>
/// 古典風格家具工廠
/// </summary>
public class ClassicFurnitureFactory : IFurnitureFactory
{
    public IChair CreateChair() => new ClassicChair();
    public ITable CreateTable() => new ClassicTable();
}

🚀 實際使用工廠範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 購買現代風格家具
        IFurnitureFactory modernFactory = new ModernFurnitureFactory();
        var modernChair = modernFactory.CreateChair();
        var modernTable = modernFactory.CreateTable();
        modernChair.SitOn();
        modernTable.Use();

        Console.WriteLine();

        // 購買古典風格的家具
        IFurnitureFactory classicFactory = new ClassicFurnitureFactory();
        var classicChair = classicFactory.CreateChair();
        var classicTable = classicFactory.CreateTable();
        classicChair.SitOn();
        classicTable.Use();
    }
}

🎯 執行結果

使用現代風格的桌子。
坐在現代風格的椅子上。

使用古典風格的桌子。
坐在古典風格的椅子上。

⚠️ 使用抽象工廠模式要注意什麼?

  • 好處:容易維護與擴充,同一個產品系列可以輕鬆管理。
  • 缺點是新增產品可能需要增加許多類別,有時候會顯得比較繁瑣。

🎉 結語

恭喜你又掌握了一個超實用的設計模式!透過抽象工廠模式,你可以輕鬆管理一整套產品系列,讓你的程式碼變得更加靈活。

接下來我們會繼續探索更多模式,一樣輕鬆有趣又實用,記得持續關注喔!下次見啦~

系列:

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

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

還有疑問

Learning path

設計模式

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

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