2016-09-07 44 views
5

podczas korzystania z Builder Pattern dlaczego nie powinienem ponownie użyć obiektu budowniczego, aby uzyskać dostęp do konfiguracji obiektu? Na przykład:Podczas używania wzorca konstruktora, dlaczego nie powinienem ponownie użyć obiektu budowniczego, aby uzyskać dostęp do konfiguracji obiektu?

normalny sposób:

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

Ale dlaczego nie można po prostu użyć tego:

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

Thanks :)

+6

Cały sens używania budowniczego polega na budowaniu niezmiennych obiektów: budowniczy jest zmienny, to, co buduje, nie jest. Jeśli przekazujesz uprawnienia do konstruktora, twoja instancja znów może być zmieniana: każdy, kto ma odniesienie do tego samego wystąpienia 'ObjectBuilder' może zmienić twoje' ObjectA'. Jeśli chcesz zmienić obiekt, nie ma potrzeby budowania: po prostu ustawiaj obiekty na twoim 'ObjectA'. –

+0

To całkiem dobra odpowiedź. To prawda, nie chcę, żeby A zmieniło się po konstruktorze. Właśnie dlatego użyłem budowniczego w pierwszej kolejności. –

Odpowiedz

7

Duże powody zastosowania Builder zbudować niezmienny obiekt: budowniczy jest zmienny, to, co buduje, nie jest (koniecznie).

Po przekazaniu uprawnień do konstruktora instancja będzie ponownie zmieniana: każdy, kto ma odwołanie do tego samego wystąpienia z ObjectBuilder, może zmienić swoją ObjectA. Oznacza to, że wszelkie kontrole dotyczące ważności stanu ObjectA w czasie budowy mogą zostać unieważnione.

Jeśli chcesz zmiennego obiektu, nie ma potrzeby, aby budowniczy: po prostu mieć setters na swoim ObjectA.

+2

Jeśli chcesz zmienić obiekt, nie ma potrzeby budowania. Konstruktorzy są dobrzy dla czegoś więcej niż tylko niezmienności. – jaco0646

+0

@AndyTurner Mam podobne pytanie na wzór Builder [tutaj] (http://stackoverflow.com/questions/41206286/how-to-clone-old-builder-to-make-a-new-builder-object). Chciałem sprawdzić, czy możesz mi pomóc. –