gpt4 book ai didi

c# - builder 模式中 builder 的创建

转载 作者:行者123 更新时间:2023-11-30 22:40:00 28 4
gpt4 key购买 nike

我想阐明我对构建器模式的使用,特别是构建器类型是如何创建的。在示例中,它只是假定构建器的类型并创建它。但是,我在“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; } }
}

最佳答案

我认为您真正想要的是使用工厂模式来创建生成器类。 Director 不创建 Builder 但依赖于它们。

看看this site它可以很好地洞察模式并使用一些真实的例子。

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

现在您已经在工厂中创建了构建器,您可以开始了。如果您想删除正确构建器的条件/发现,根据系统的大小和复杂性,有许多选项。

  1. 如果构建器类型和数据类型的数量不会改变(或根本不会改变),就让它保持原样
  2. 通过字典在构建器和类型之间建立映射。 (更复杂)见下文
  3. 或者通过读取数据类型与构建器类型之间映射的文件,通过配置完全驱动它。 (有点过火但可能)

最后两个选项可能涉及反射(使用 Activator 类)以创建 Builder 类(或一些依赖注入(inject)容器,例如 unity ),但确切的机制至少封装在 ChartBuilderFactory 中

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

关于c# - builder 模式中 builder 的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5427185/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com