3

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

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; } }
}
4

1 回答 1

3

我认为您实际上想要的是使用工厂模式来创建 Builder 类。Director 不创建 Builder,但依赖于它们。

看看这个网站,它可以很好地了解模式并使用一些真实的例子。

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

Now that you have the creating of the Builders inside a factory you are set to go. If you want to remove the condition / finding of the correct builder there are a number of options depending on the size and complexity of the system.

  1. Leave it the way you have it if the number of types of builder and data types will not change (or much at all)
  2. Have a mapping between the builder and type through a dictionary. (more complex) see below
  3. Or completely drive it through configuration by reading a file that maps between the type of data to the type of builder. (going a bit overboard but possible)

The last 2 options might involve reflection (using the Activator class) in order to create the Builder class (or some Dependency Injection containers such as unity), but the exact mechanics are at least encapsulated inside the ChartBuilderFactory

理想情况下,如果您使用依赖注入(控制反转),您将对象的构造与它们的使用方式分开。如果你把它集中起来,它就会变得更容易控制,如果你需要的话,甚至可以在以后进行更改。更不用说让它更容易测试了。

于 2011-03-25T00:41:02.250 回答