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

原型模式:複製的藝術

原型模式 (Prototype Pattern) 透過複製現有物件來建立新物件,省去繁瑣的初始化過程。本文使用 C# 履歷表範例帶你實作。

嗨!繼續設計模式系列,這次要介紹的主角是原型模式(Prototype)。聽到「原型」這個詞是不是有點不太確定這到底是什麼?別擔心,我們還是用輕鬆易懂的方式來理解它吧!

🌟 原型模式到底在做什麼?

原型模式簡單來說就是透過「複製」現有的物件,來建立一個新物件。就像我們常用的「複製貼上」一樣。

比如你去文具店要印名片,你只需要給店員一張原稿,他就能根據這份原稿複製出許多張一模一樣的名片,而不用一張一張重新設計。


🤔 什麼時候該用原型模式?

  • 物件的建立成本較高(例如需要從資料庫讀取大量資料)。
  • 你要建立的物件跟現有物件差異不大,只需要稍微修改一下就可以使用。
  • 希望降低物件建立時的複雜度與耗時。

📑 C# 原型模式範例

這次我們就以「履歷表複製」作為實際案例,來看看怎麼使用原型模式吧!

📄 定義原型介面

/// <summary>
/// 原型介面,提供複製方法
/// </summary>
public interface IResume
{
    /// <summary>
    /// 複製自身
    /// </summary>
    IResume Clone();

    /// <summary>
    /// 顯示履歷內容
    /// </summary>
    void Display();
}

📄 實作具體原型類別

using System;

/// <summary>
/// 履歷表
/// </summary>
public class Resume : IResume
{
    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 工作經驗
    /// </summary>
    public string Experience { get; set; }

    public Resume(string name, string experience)
    {
        Name = name;
        Experience = experience;
    }

    /// <summary>
    /// 複製自身
    /// </summary>
    public IResume Clone()
    {
        // 直接淺層複製即可
        return (IResume)this.MemberwiseClone();
    }

    /// <summary>
    /// 顯示履歷內容
    /// </summary>
    public void Display()
    {
        Console.WriteLine($"姓名:{Name},工作經歷:{Experience}");
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 原始履歷
        Resume resumeOriginal = new Resume("小明", "軟體工程師,3年經驗");
        resumeOriginal.Display();

        // 複製出新的履歷表,稍作修改
        Resume resumeCopy = (Resume)resumeOriginal.Clone();
        resumeCopy.Name = "小美";
        resumeCopy.Display();
    }
}

🎯 執行結果

姓名:小明,工作經歷:軟體工程師,3年經驗
姓名:小美,工作經歷:軟體工程師,3年經驗

⚠️ 原型模式的使用注意事項

  • 優點:可以大幅提升效能,節省建立新物件的時間與成本。
  • 缺點:當物件結構複雜時,深層複製會比較麻煩。

🎉 結語

太棒啦~你又成功學會了一個設計模式:原型模式(Prototype)!這個模式能幫助我們快速又有效率地製造出一系列類似的物件,讓程式更高效。

我們會繼續帶你探索其他設計模式,用輕鬆的方式陪你一起進步,敬請期待下一篇囉!

系列:

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

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

還有疑問

Learning path

設計模式

這篇是系列中的第 5 / 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。

閱讀導覽

約 2 分鐘

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