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

C# 設計模式實作:抽象工廠模式完整範例

     編輯:關於C語言

模式意圖

抽象工廠模式提供一個介面,用於建立相關或相依物件的家族,而不需要指定它們的具體類別。本範例以「樣式家族」為例:字型樣式與表格樣式必須搭配使用(StyleA 或 StyleB)。

類別結構

  • 抽象產品:FontsStyle、TablesStyle
  • 具體產品:FontsStyleA/B、TablesStyleA/B
  • 抽象工廠:StyleFactory 定義 CreateFontsStyle()、CreateTablesStyle()
  • 具體工廠:StyleA、StyleB
  • 客戶端:HomePage 接受工廠建構,組合產品產出 HTML

完整程式碼

using System;

// 抽象產品
abstract class FontsStyle { public string StyleString; }
abstract class TablesStyle { public string StyleString; }

// 具體產品
class FontsStyleA : FontsStyle { public FontsStyleA() { StyleString = "FontsStyleA"; } }
class FontsStyleB : FontsStyle { public FontsStyleB() { StyleString = "FontsStyleB"; } }
class TablesStyleA : TablesStyle { public TablesStyleA() { StyleString = "TablesStyleA"; } }
class TablesStyleB : TablesStyle { public TablesStyleB() { StyleString = "TablesStyleB"; } }

// 抽象工廠
abstract class StyleFactory
{
    public abstract FontsStyle CreateFontsStyle();
    public abstract TablesStyle CreateTablesStyle();
}

// 具體工廠
class StyleA : StyleFactory
{
    public override FontsStyle CreateFontsStyle() => new FontsStyleA();
    public override TablesStyle CreateTablesStyle() => new TablesStyleA();
}
class StyleB : StyleFactory
{
    public override FontsStyle CreateFontsStyle() => new FontsStyleB();
    public override TablesStyle CreateTablesStyle() => new TablesStyleB();
}

// 客戶端:使用工廠建立產品家族
class HomePage
{
    private FontsStyle _fonts;
    private TablesStyle _tables;
    private string _html = "<html><body><table style='tablesstyle'><tr><td><font style='fontsstyle'>HelloWorld!</font></td></tr></table></body></html>";

    public HomePage(StyleFactory factory)
    {
        _fonts = factory.CreateFontsStyle();
        _tables = factory.CreateTablesStyle();
        _html = _html.Replace("fontsstyle", _fonts.StyleString)
                       .Replace("tablesstyle", _tables.StyleString);
    }

    public void PrintHtmlCode() => Console.WriteLine(_html);
}

// 測試程式
class TestApp
{
    public static void Main()
    {
        var factoryA = new StyleA();
        var page1 = new HomePage(factoryA);
        page1.PrintHtmlCode(); // 輸出 StyleA 版本

        var factoryB = new StyleB();
        var page2 = new HomePage(factoryB);
        page2.PrintHtmlCode(); // 輸出 StyleB 版本
    }
}

執行結果

<html><body><table style='TablesStyleA'><tr><td><font style='FontsStyleA'>HelloWorld!</font></td></tr></table></body></html>
<html><body><table style='TablesStyleB'><tr><td><font style='FontsStyleB'>HelloWorld!</font></td></tr></table></body></html>

適用情境

  • 系統需支援多個「產品家族」,且同一家族的產品必須搭配使用(如 UI 主題、資料庫驅動程式)。
  • 想將具體類別的實例化細節封裝,讓客戶端只依賴抽象介面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved