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を作成しませんが、それらに依存します。

パターンについての良い洞察を与え、いくつかの実際の例を使用しているこのサイトを見てください。

[編集:改訂された質問に基づく]

これで、ファクトリ内にBuilderを作成できたので、準備が整いました。条件を削除したい/正しいビルダーを見つけたい場合は、システムのサイズと複雑さに応じていくつかのオプションがあります。

  1. ビルダーのタイプとデータタイプの数が変わらない(またはまったく変わらない)場合は、そのままにしておきます
  2. ビルダーとタイプの間のマッピングを辞書で行います。(より複雑)以下を参照
  3. または、データのタイプとビルダーのタイプの間でマップされるファイルを読み取って、構成を完全に実行します。(少し船外に出ますが、可能です)

最後の2つのオプションには、Builderクラス(またはunityなどの依存性注入コンテナ)を作成するためのリフレクション(Activatorクラスを使用)が含まれる場合がありますが、正確なメカニズムは少なくともChartBuilderFactory

理想的には、依存性注入(制御の反転)を使用する場合は、オブジェクトの構成を使用方法から分離します。また、これを一元化すると、制御が容易になり、必要に応じて後で変更することもできます。テストを容易にすることは言うまでもありません。

于 2011-03-25T00:41:02.250 に答える