2016-09-07 119 views
5

使用Builder Pattern時,爲什麼我不應該重用構建器對象來訪問對象配置? 例如:使用Builder模式時,爲什麼我不應該重新使用構建器對象來訪問對象配置?

正常方式:

ObjectA(ObjectBuilder b) { 
    this.a = b.getA(); 
} 
public Object getA(){ 
    return this.a; 
} 

但爲什麼我就不能使用這個:

ObjectA(ObjectBuilder b) { 
    this.builder = b; 
} 
public Object getA(){ 
    return this.builder.getA(); 
} 

謝謝:)

+6

關於使用構建器的關鍵是要構建不可變對象:構建器是可變的,它構建的事物不是。如果委派給構建器,那麼您的實例會再次變爲可變:任何引用同一個ObjectBuilder實例的人都可以更改您的ObjectA。如果你想要一個可變對象,那麼不需要構建器:只需在你的ObjectA上設置setter。 –

+0

這是一個很好的答案。這是真的,我不希望A在構造函數之後被改變。這就是我首先使用建築師的原因。 –

回答

7

很大原因使用生成器是構建一個不可變的對象:構建器是可變的,它構建的東西不是(必然的)。

如果您委託給構建器,您的實例將再次變爲可能:任何參照相同實例ObjectBuilder的人都可以更改您的ObjectA。這意味着您在施工時對ObjectA狀態的有效性進行的任何檢查都可能失效。

如果您想要一個可變對象,則無需構建器:只需在您的ObjectA上設置setter即可。

+2

如果你想要一個可變對象,那麼對於構建器就需要_less_。建築商不僅僅是不變的, – jaco0646

+0

@AndyTurner我在Builder模式[這裏]有類似的問題(http://stackoverflow.com/questions/41206286/how-to-clone-old-builder-to-make-a-new-builder-object)。想看看你有沒有可以在那邊幫我。 – 2016-12-20 00:27:25

相關問題