2012-08-15 103 views
0

我正在設計一個新的應用程序,並考慮以下問題。增強構建器 - 構建器的子類或創建構建器修飾器?


背景資料

我將有一個生成器類叫做HouseBuilder建房子類型的對象。構建器將提供以下方法:

  • buildRoof(),
  • buildWindow(),
  • buildDoor(),
  • 等,
  • getHouse()。

在客戶端代碼,我將通常使用的助洗劑類這樣的:

HouseBuilder builder = new HouseBuilder(); 
House house = builder.buildRoof().buildWindow().buildWindow().buildDoor().getHouse(); 

這是在使用一個生成器設計圖案的典型例子。


問題

在客戶端的代碼,我需要建立一個特定類型的房子,比方說,一個平房。從基本構建模塊(如上面的示例中)構建小屋時,每次我需要一個新的小塊時,似乎都會有很多不必要的重複代碼。

因此,我要創建一個新的器類,比方說,一個CottageBuilder,這將允許這樣的事情:

HouseBuilder builder = new CottageBuilder(); 
House house = builder.buildCottage().getHouse(); 

我不確定什麼是最好的方式來設計的CottageBuilder是。兩個選項浮現在腦海中:

  • 有CottageBuilder是HouseBuilder的子類,並使用buildCottage方法中父母的方法,
  • 有CottageBuilder接受HouseBuilder實例,並調用它的buildCottage方法中的方法(無論如何,我會讓CottageBuilder繼承HouseBuilder,以獲得多態行爲 - 所以我會讓CottageBuilder成爲HouseBuilder周圍的裝飾器)。

哪種方法更好?

我能想到的第二種方法的一個缺點是,CottageBuilder需要依賴另一個HouseBuilder實例,並且我會讓它在它的構造函數中請求依賴關係。然而,從客戶端代碼的角度來看,將HouseBuilder實例設置到CottageBuilder實例中似乎很奇怪。


請注意,我的構建者實際上並不打算構建House對象,而是來自不同域的對象。我決定不要用描述目標領域來污染問題,而是要彌補這個比喻,這在我看來很適合原來的問題。

+0

請問'CottageBuilder'總是建立相同類型的房子還是可以進一步定製與'HouseBuilder'? – casablanca 2012-08-16 07:05:59

+0

總是相同的類型。我正在尋找創建別墅的捷徑的最佳方式,而不是在每次需要新建別墅時從基本構建塊創建它們。 – 2012-08-16 07:20:30

回答

1

「構建器」通常會在一系列步驟中構建對象,例如您的示例中的HouseBuilder。您的CottageBuilder不是真正的建築商,而是返回特定類型房屋的「工廠」。所以,我想有一個HouseFactory類的靜態方法來創建不同類型的房屋:

public class HouseFactory { 
    public static House createCottage() { 
    HouseBuilder builder = new HouseBuilder(); 
    // use builder to build cottage 
    return builder.getHouse(); 
    } 

    // more methods for other types of houses 
} 
+0

聽起來很對,謝謝!我不會將createCottage方法設爲靜態,並且會讓HouseFactory接受HouseBuilder的一個實例作爲構造函數參數。它應該更容易測試,重用等。 – 2012-08-16 07:48:52

+0

@DušanRychnovský:我通常避免使用靜態類,但這是一個可以接受的用例,因爲'createCottage'只是一種實用方法 - 正如您之前提到的,「創建別墅的捷徑「而不是複製代碼。如果你真的覺得需要測試這種方法,那麼你應該把它重構成更小的可測試件。 – casablanca 2012-08-17 01:34:28