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

C# 設計模式實作:建造者模式完整範例

     編輯:關於C語言

模式意圖

建造者模式將複雜物件的建構過程與其表示分離,使相同的建構過程可以建立不同的表示。本範例以「網頁建構」為例:相同流程(框架→表格→Span)產出不同風格(Cool/Warm/Clear)的頁面。

角色分配

  • Product:HomePage,內含 Hashtable parts 存放各部件 HTML 片段
  • Builder:PageBuilder 抽象類別,定義 BuildFrame/BuildTable/BuildSpan
  • ConcreteBuilder:CoolBuilder、WarmBuilder、ClearBuilder 實作具體 HTML
  • Director:PageDirector 控制建構順序

完整程式碼

using System;
using System.Collections;

// 產品
class HomePage
{
    private string _pageType;
    private string _template = "<html><body>parttable,partspan</body></html>";
    private Hashtable _parts = new Hashtable();

    public HomePage(string pageType) { _pageType = pageType; }

    public object this[string key]
    {
        get => _parts[key];
        set => _parts[key] = value;
    }

    public void PrintHtmlCode()
    {
        string html = _template
            .Replace("parttable", _parts["table"].ToString())
            .Replace("partspan", _parts["span"].ToString());
        Console.WriteLine(html);
    }
}

// 指導者
class PageDirector
{
    public void Construct(PageBuilder builder)
    {
        builder.BuildFrame();
        builder.BuildTable();
        builder.BuildSpan();
    }
}

// 抽象建造者
abstract class PageBuilder
{
    protected HomePage _homePage;
    public HomePage HomePage => _homePage;
    public abstract void BuildFrame();
    public abstract void BuildTable();
    public abstract void BuildSpan();
}

// 具體建造者
class CoolBuilder : PageBuilder
{
    public override void BuildFrame() => _homePage = new HomePage("coolpage");
    public override void BuildTable() => _homePage["table"] = "<table color=cool><tr><td></td></tr></table>";
    public override void BuildSpan() => _homePage["span"] = "<span color=cool></span>";
}
class WarmBuilder : PageBuilder
{
    public override void BuildFrame() => _homePage = new HomePage("warmpage");
    public override void BuildTable() => _homePage["table"] = "<table color=warm><tr><td></td></tr></table>";
    public override void BuildSpan() => _homePage["span"] = "<span color=warm></span>";
}
class ClearBuilder : PageBuilder
{
    public override void BuildFrame() => _homePage = new HomePage("clearpage");
    public override void BuildTable() => _homePage["table"] = "<table color=clear><tr><td></td></tr></table>";
    public override void BuildSpan() => _homePage["span"] = "<span color=clear></span>";
}

// 測試
class TestApp
{
    public static void Main()
    {
        var director = new PageDirector();
        var builders = new PageBuilder[] { new CoolBuilder(), new WarmBuilder(), new ClearBuilder() };
        foreach (var b in builders)
        {
            director.Construct(b);
            b.HomePage.PrintHtmlCode();
        }
    }
}

執行結果

<html><body><table color=cool><tr><td></td></tr></table>,<span color=cool></span></body></html>
<html><body><table color=warm><tr><td></td></tr></table>,<span color=warm></span></body></html>
<html><body><table color=clear><tr><td></td></tr></table>,<span color=clear></span></body></html>

關鍵優勢

  • 建構邏輯(Director)與具體實作(Builder)分離,易於新增新風格。
  • 產品內部結構複雜時,可隱藏組裝細節。
  • 符合單一職責原則:每個 Builder 只負責一種風格的建構細節。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved