工廠方法模式定義一個建立物件的介面,但由子類別決定要實例化的類別。本範例以「首頁頁面組成」為例:Forum(論壇)與 GuestBook(留言板)擁有不同的頁面組合,透過覆寫 CreateHomePage() 實現。
SinglePage 抽象基類,具體頁面 RegisterPage、LoginPage、IndexPage、TitlePage、ContentPage、PostPage、ReplyPageHomePage 抽象類別,宣告工廠方法 CreateHomePage(),建構子中呼叫它填充 Pages 集合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
| 維度 | 工廠方法 | 抽象工廠 |
|---|---|---|
| 核心目的 | 延遲實例化到子類別 | 建立相關物件家族 |
| 結構 | 繼承為主(Creator 子類別) | 組合為主(Factory 介面 + 多個 ConcreteFactory) |
| 適用性 | 單一產品層次,多種變體 | 多個產品層次,需強制搭配 |
if/else 或 switch。