2011-03-25 74 views
2

我想澄清一下我對建造者模式的使用,特別是如何創建建造者類型。在示例中,它只是假設了構建器的類型並創建它。但是,我在'ChartBuilderFactory'類中創建了一個CreateBuilder方法,該類根據傳遞給它的某個對象返回構建器的類型。這是做這件事的最好方法嗎?我已經發布了我的示例代碼,並希望更好的設計替代方案和建議。在Builder圖案中創建建造者

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; } } 
} 
+0

更新了問題以解決aqwert的答案。 – Seth 2011-03-25 01:56:40

回答

3

我想你實際上想要的是使用Factory模式來創建Builder類。導演不創建Builder,但依賴於他們。

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

[編輯:根據修訂後的問題]

現在你已經建設者你可以走了一個工廠內的創建。如果要刪除正確的構建器的條件/查找結果,則根據系統的大小和複雜性有多種選擇。

  1. 離開它你有它的方式,如果類型的建設者和數據類型的數量不會改變(或多少都)
  2. 有製造商之間的映射,然後鍵入通過詞典。 (更復雜)參見下面的
  3. 或者通過讀取映射數據類型到構建器類型的文件來完成驅動器配置。 (會有點過分,但可能)

最後2個選項可能包括反射,以創建生成器類(使用Activator類)(或依賴注入容器,如unity),但確切機制是至少封裝在ChartBuilderFactory

理想情況下,如果您使用依賴注入(控制反轉),您將使用它們的方式分離對象的構造。如果你集中這個,如果你需要的話,它會變得更容易控制,甚至更改。更不用說讓測試更容易了。

+0

幾乎只有一個具體的創建工廠,它包含返回具體產品(ChartBuilder)的'CreateBuilder'方法?不知道爲什麼我需要抽象創作者? – Seth 2011-03-25 00:56:30

+0

我這樣說是因爲建造者的建造不是主任的責任。如果你想分離問題,你可能想要考慮這種方法 – aqwert 2011-03-25 01:30:57

+0

我更新了問題,並將ChartBuilder創建分離爲更精簡的工廠類。 – Seth 2011-03-25 01:58:21