我正在設計一個新的應用程序,並考慮以下問題。增強構建器 - 構建器的子類或創建構建器修飾器?
背景資料
我將有一個生成器類叫做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對象,而是來自不同域的對象。我決定不要用描述目標領域來污染問題,而是要彌補這個比喻,這在我看來很適合原來的問題。
請問'CottageBuilder'總是建立相同類型的房子還是可以進一步定製與'HouseBuilder'? – casablanca 2012-08-16 07:05:59
總是相同的類型。我正在尋找創建別墅的捷徑的最佳方式,而不是在每次需要新建別墅時從基本構建塊創建它們。 – 2012-08-16 07:20:30