首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式實作:工廠方法模式完整範例

     編輯:關於C語言

模式意圖

工廠方法模式定義一個建立物件的介面,但由子類別決定要實例化的類別。本範例以「首頁頁面組成」為例:Forum(論壇)與 GuestBook(留言板)擁有不同的頁面組合,透過覆寫 CreateHomePage() 實現。

類別結構

  • Product:SinglePage 抽象基類,具體頁面 RegisterPage、LoginPage、IndexPage、TitlePage、ContentPage、PostPage、ReplyPage
  • Creator:HomePage 抽象類別,宣告工廠方法 CreateHomePage(),建構子中呼叫它填充 Pages 集合
  • ConcreteCreator:Forum、GuestBook 實作具體頁面組合

完整程式碼

using System;
using System.Collections;

// 產品階層
abstract class SinglePage { }
class RegisterPage : SinglePage { }
class LoginPage : SinglePage { }
class IndexPage : SinglePage { }
class TitlePage : SinglePage { }
class ContentPage : SinglePage { }
class PostPage : SinglePage { }
class ReplyPage : SinglePage { }

// 建立者階層
abstract class HomePage
{
    protected ArrayList _pages = new ArrayList();
    public ArrayList Pages => _pages;

    public HomePage() { CreateHomePage(); } // 建構子觸發工廠方法
    protected abstract void CreateHomePage(); // 工廠方法
}

// 具體建立者:論壇首頁
class Forum : HomePage
{
    protected override void CreateHomePage()
    {
        Pages.Add(new RegisterPage());
        Pages.Add(new LoginPage());
        Pages.Add(new IndexPage());
        Pages.Add(new TitlePage());
        Pages.Add(new ContentPage());
        Pages.Add(new PostPage());
        Pages.Add(new ReplyPage());
    }
}

// 具體建立者:留言板首頁
class GuestBook : HomePage
{
    protected override void CreateHomePage()
    {
        Pages.Add(new RegisterPage());
        Pages.Add(new LoginPage());
        Pages.Add(new ContentPage());
        Pages.Add(new ReplyPage());
    }
}

// 測試
class TestApp
{
    public static void Main()
    {
        HomePage forum = new Forum();
        HomePage guestbook = new GuestBook();

        Console.WriteLine("=== Forum 頁面包含 ===");
        foreach (SinglePage p in forum.Pages) Console.WriteLine(p.GetType().Name);

        Console.WriteLine("\n=== GuestBook 頁面包含 ===");
        foreach (SinglePage p in guestbook.Pages) Console.WriteLine(p.GetType().Name);
    }
}

執行結果

=== Forum 頁面包含 ===
RegisterPage
LoginPage
IndexPage
TitlePage
ContentPage
PostPage
ReplyPage

=== GuestBook 頁面包含 ===
RegisterPage
LoginPage
ContentPage
ReplyPage

模式比較:工廠方法 vs 抽象工廠

維度工廠方法抽象工廠
核心目的延遲實例化到子類別建立相關物件家族
結構繼承為主(Creator 子類別)組合為主(Factory 介面 + 多個 ConcreteFactory)
適用性單一產品層次,多種變體多個產品層次,需強制搭配

適用情境

  • 框架定義好流程(如首頁初始化),但具體包含哪些頁面由具體應用決定。
  • 想將「建立邏輯」集中在子類別,避免在基類中出現大量 if/else 或 switch。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved