何时使用构建器设计模式

时间:2015-06-11 10:51:49

标签: design-patterns builder

构建器设计模式是否是创建itemBrowsePanel对象的正确模式?此对象需要另外两个对象(iconBrowsePanel,textBrowsePanel)才能准备好使用,如下所示:

    HTMLPanel itemBrowsePanel=new HTMLPanel("");

    HTMLPanel iconBrowsePanel=new HTMLPanel("");        

    HTMLPanel textBrowsePanel=new HTMLPanel("");

    HTMLPanel titlePanel=new HTMLPanel(titlePanelText);     

    HTMLPanel subTitlePanel=new HTMLPanel(subTitlePanelText+" "+panelName);

    textBrowsePanel.add(titlePanel);
    textBrowsePanel.add(subTitlePanel);

    itemBrowsePanel.add(iconBrowsePanel);
    itemBrowsePanel.add(textBrowsePanel);

如果构建器设计模式是正确的,是否适用于在创建时将参数传递给任何对象以构造其他对象?

2 个答案:

答案 0 :(得分:1)

在这种情况下,

Composite Pattern更好,因为您正在构建聚合对象。它还提供了更大的灵活性,例如,更容易将面板更改为接受3个而不是2个子对象。

首先,为系统中的所有UI元素创建基类。

public abstract class UIElement
{
    public string Name { get; set; }

    protected UIElement(string name)
    {
        this.Name = name;
    }

    public abstract void Add(UIElement element);
}

然后添加HTMLPanel并覆盖添加以执行您想要的任何操作。在这种情况下,您希望将其子对象限制为两个。

public class HTMLPanel
    : UIElement
{
    private List<UIElement> children = new List<UIElement>();

    // constructor here

    public override void Add(UIElement element)
    {
        if (this.children.Count > 2)
        {
            throw new Exception("");
        }

        this.children.Add(element);
    }
}

要构建对象,它与您在问题中所做的相似或完全相同。

将来,您可能希望在面板中显示标签。您可以通过添加新类轻松实现这一目标。

public class Label
    : UIElement
{
    public override void Add(UIElement element)
    {
        throw new NotSupportedException("Labal cannot have a child element.");
    }
}

您可以将其添加到面板中。

HTMLPanel subTitlePanel = new HTMLPanel(subTitlePanelText+" "+panelName);

Label yourLabelObject = new Label("myLabel");
textBrowsePanel.add(yourLabelObject);

答案 1 :(得分:0)

  

此对象需要另外两个对象(iconBrowsePaneltextBrowsePanel)以便随时可以使用

  1. 如果您想确保iconBrowsePaneltextBrowsePanel在使用之前添加到itemBrowsePanel,那么最好使用特定构造函数创建ItemBrowsePanel类它采用这些参数并确保不变
  2.   

    构建器设计模式是否是创建itemBrowsePanel对象的正确模式?

    1. 如果您想在其他地方重用现有的构造算法,最好将其包含到一个方法中,该方法接受titlePanelTextsubTitlePanelTextpanelName等参数并返回完全构造的HTMLPanel,代表itemBrowsePanel

    2. 如果创建itemBrowsePanel的参数和/或参数组合太多,那么是的,使用构建器可能是合适的