2012-07-24 57 views
3

我剛剛讀了builder pattern的奇幻example我的建造者是否需要在它建造的類中?

在我的程序中,我創建了一系列playerCharacter實體,它可以用各種方式構建,有一些必填字段,還有一些可以作爲額外添加或添加在後(建設後)。所以,在閱讀了上述文章後,似乎我需要一個構建器模式。

我是否可以選擇構建器和超類(在此示例中,示例Pizzabuilder)共享某些方法? 這是否有一個整潔,已知的解決方案?

例如,如果在(的比薩餅)上面的例子中,在以後的時間,我們不得不的Boolean isPizzaCold()void heatTo(int degrees)的方法,我們希望比薩返回false下手,因爲它的「建」熱,然後讓披薩「變涼」,以便它變涼。我如何做到這一點,使他們分享相同的方法?

[edit:按Joeri's建議,我已經改變了方法示例]

回答

1

如果你把生成器出來的類,它仍然是一個建設者。建設者首先是構建對象的便捷方式,但並不總是唯一的方法。你甚至可以說,創建一個對象顯然是一個單獨的責任,並且將它分離得更乾淨(就像工廠生成器模式的結合)。我個人認爲這主要取決於創作的複雜性。

不,您的對象和構建器類不能共享方法。分享方法的唯一途徑是通過繼承,這顯然不適用於此。

你的構建器是一個一次性的對象,它構建的對象顯然是一個不同的類。你唯一能做的就是存儲請求的值,並在構建對象後自動調用相應的setter。

void setTemperature(int t){ 
    this.temperature = t; 
} 

Pizza build() { 
    Pizza pizza = new Pizza(... usual constructor stuff); 
    pizza.setTemperature(temperature); 
    return pizza; 
} 

此外,我想知道void setTemperature(int)是否有意義。 void heatTo(int degrees)對我更有意義:)

+0

我將如何委託方法?這聽起來是正確的。 – Pureferret 2012-07-24 11:50:37

+0

對不起,不委託方法;你不能使用那些,因爲你還沒有你的對象:)我更新了答案。 – 2012-07-24 12:26:28

+0

不打破模式?我認爲你的代碼讓我感到困惑,這是'Builder'還是'Pizza'類的方法?爲什麼它附有一個構造函數? – Pureferret 2012-07-24 12:44:45

1

我實在不明白你的問題和建造者模式之間的關係。如果你想有一個方法setTemperature()和方法isCold(),只需將它們添加到比薩:

private static final int COLD_THRESHOLD = 40; 
private int temperature = 70; 

public void setTemperature(int temperature) { 
    this.temperature = temperature; 
} 

public boolean isCold() { 
    return temperature <= COLD_THRESHOLD; 
} 
+0

在示例show中,builder是一個嵌套的抽象類,(super)pizza類中沒有方法。我如何讓他們分享一部分方法? – Pureferret 2012-07-24 11:12:58

+1

否。在示例中,Builder是一個公共靜態內部類,不是抽象的,並且沒有超類:Builder不擴展Pizza。他們根本不會分享任何方法。比薩中的方法只是沒有寫出來保持簡潔的例子,但比薩應當有方法,但它沒有任何用途。建造者的領域只是在施工時被複制到比薩的領域。 – 2012-07-24 11:23:37

+0

但是,如果我確實希望他們分享方法(儘管可能在這裏*比薩*不是,曾經是最好的例子),無論出於何種原因呢? – Pureferret 2012-07-24 12:54:46

相關問題