[英]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
這是否意味着我們需要讓HtmlBuilder
從HtmlElement
繼承? 但是它們根本不是繼承上下文,那么如何修改它呢?
該代碼是錯誤的。 構建器類無法訪問。 作者可能打算使用工廠方法。
我完全不同意作者。
切勿試圖強迫用戶僅以適合某種模式的方式使用類。 構建器模式的全部目的是降低構建對象時的復雜性,而不是使其變得更難。
構建器模式最常用於構建對象鏈而不是簡單對象(如HTML元素)的情況。 例如,您可以使用CarBuilder來構建具有引擎,變速箱和獲得功能性汽車所需的所有其他對象的汽車。
您可能有一個SafeCarBuilder
,它使用更強的SafeCarBuilder
,但引擎相同;而FastCarBuilder
,它使用默認FastCarBuilder
,但為引擎增加了渦輪增壓。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.