在Builder模式中创建构建器

时间:2011-03-25 00:17:09

标签: c# builder-pattern

我想澄清一下我对构建器模式的使用,特别是如何创建构建器的类型。在示例中,它只是假定构建器的类型并创建它。但是,我在'ChartBuilderFactory'类中创建了一个CreateBuilder方法,该类根据传递给它的某个对象返回构建器的类型。这是最好的方法吗?我已经发布了我的示例代码,并希望获得更好设计的替代方案和建议。

class Program
{
    static void Main(string[] args)
    {
        DataObject data = new DataObject("basic", 2);

        ChartDirector director = new ChartDirector();
        ChartBuilderFactory builderFactory = new ChartBuilderFactory();
        ChartBuilder builder = builderFactory.CreateChartBuilder(data);
        director.Construct(builder);

        Console.WriteLine(builder.GetChart());
        Console.ReadKey();
    }
}

class ChartBuilderFactory
{
    public ChartBuilder CreateChartBuilder(DataObject data)
    {
        ChartBuilder builder;
        if (data.DataType == "basic")
            builder = new ChartBuilderBasic(data);
        else if (data.DataType == "vector")
            builder = new ChartBuilderVector(data);
        else
            builder = null;

        return builder;
    }
}           

class ChartDirector
{

    public void Construct(ChartBuilder builder)
    {
        builder.CreateChart();
        builder.LoadData();
    }
}

abstract class ChartBuilder
{
    protected string myChartObject = "";
    protected DataObject data;

    public ChartBuilder(DataObject data)
    {
        this.data = data;
    }

    abstract public void CreateChart();
    abstract public void LoadData();
    public string GetChart() { return myChartObject; } 
}

class ChartBuilderBasic : ChartBuilder
{
    public ChartBuilderBasic(DataObject data)
        : base(data) { }

    public override void CreateChart()
    {
        myChartObject = "MyBasicChart";
    }

    public override void LoadData()
    {
        myChartObject += Convert.ToString(data.Data);
    }
}

class ChartBuilderVector : ChartBuilder
{ /** Alternative Implementation here */ }

class DataObject
{
    /** Constructor and private member variables here */
    public string DataType { get { return this.dataType; } }
    public int Data { get { return this.data; } }
}

1 个答案:

答案 0 :(得分:3)

我认为你真的想要使用Factory模式来创建Builder类。 Director不会创建Builder,但依赖于它们。

查看this site,它可以很好地了解模式并使用一些真实的例子。

[编辑:基于修订后的问题]

现在你已经在工厂内创建了Buildders,你就可以了。如果要删除正确构建器的条件/查找,根据系统的大小和复杂程度,有许多选项。

  1. 如果构建器和数据类型的类型数量不会发生变化(或者根本不变),请保持原样。
  2. 通过字典在构建器和类型之间建立映射。 (更复杂)见下文
  3. 或者通过读取在数据类型与构建器类型之间映射的文件来完全驱动它。 (有点过分但可能)
  4. 最后两个选项可能涉及反射(使用Activator类)以创建Builder类(或某些依赖注入容器,如unity),但确切的机制至少封装在{{{ 1}}

    理想情况下,如果使用依赖注入(Inversion of Control),则将对象的构造与它们的使用方式分开。如果您将其集中在一起,则可以更轻松地进行控制,如果需要,甚至可以在以后进行更改。更不用说让它更容易测试。