簡體   English   中英

結合使用Builder模式和受保護的訪問修飾符

[英]use Builder pattern combined with protected access modifier

我正在閱讀《設計模式》中的一本書,下面是作者使用的一些代碼示例。 作者嘗試將html構建器構建為:

public class HtmlElement
{
    public string Name, Text;
    public List<HtmlElement> Elements = new List<HtmlElement>();

    public HtmlElement() { }
    public HtmlElement(string name, string text)
    {
        Name = name;
        Text = text;
    }
    // factory method
    public static HtmlBuilder Create(string name)
    {
       return new HtmlBuilder(name);
    } 
}

//builder class
public class HtmlBuilder
{
    protected readonly string rootName;
    protected HtmlElement root = new HtmlElement();
    public HtmlBuilder(string rootName)
    {
        this.rootName = rootName;
        root.Name = rootName;
    }
    public HtmlBuilder AddChild(string childName, string childText)
    {
        var e = new HtmlElement(childName, childText);
        root.Elements.Add(e);
        return this;            //fluent api
    }

     // to return a HtmlElement object
    public static implicit operator HtmlElement(HtmlBuilder builder)
    {
        return builder.root;
    }
    public override string ToString() => root.ToString();
}

然后作者說:

“為了簡單地強迫用戶在構造HtmlElement對象時使用Builder,我們將HtmlElement類的所有構造函數都隱藏為”:

public class HtmlElement
{
   ...
   protected HtmlElement() { }
   protected HtmlElement(string name, string text)
   {
      Name = name;
      Text = text;
   }
   ...
}

這樣用戶就可以像

HtmlElement root = HtmlElement.Create("ul").AddChildFluent("li", "hello").AddChildFluent("li", "world");

Console.WriteLine(root);

這是我不了解的內容,作者將HtmlElement的構造函數的訪問修飾符更改為protected ,這意味着HtmlBuilder類無法訪問受保護的構造函數,例如

protected HtmlElement root = new HtmlElement();    // not allowed

這是否意味着我們需要讓HtmlBuilderHtmlElement繼承? 但是它們根本不是繼承上下文,那么如何修改它呢?

該代碼是錯誤的。 構建器類無法訪問。 作者可能打算使用工廠方法。

我完全不同意作者。

切勿試圖強迫用戶僅以適合某種模式的方式使用類。 構建器模式的全部目的是降低構建對象時的復雜性,而不是使其變得更難。

構建器模式最常用於構建對象鏈而不是簡單對象(如HTML元素)的情況。 例如,您可以使用CarBuilder來構建具有引擎,變速箱和獲得功能性汽車所需的所有其他對象的汽車。

您可能有一個SafeCarBuilder ,它使用更強的SafeCarBuilder ,但引擎相同;而FastCarBuilder ,它使用默認FastCarBuilder ,但為引擎增加了渦輪增壓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM