2016-09-07 1 views
5

Bei Verwendung eines Builder Pattern Warum sollte ich das Builder-Objekt nicht erneut verwenden, um auf die Objektkonfiguration zuzugreifen? Zum Beispiel:Wenn ich ein Builder-Muster verwende, warum sollte ich das Builder-Objekt nicht wiederverwenden, um auf die Objektkonfiguration zuzugreifen?

Normalweg:

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

Aber warum nicht kann ich dies nur verwenden:

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

Thanks :)

+6

Der ganze Punkt über die Verwendung eines Builders besteht darin, unveränderliche Objekte zu erstellen: Der Builder ist veränderlich, das, was er baut, ist nicht. Wenn Sie an den Builder delegieren, ist Ihre Instanz wieder änderbar: Jeder, der einen Verweis auf die gleiche Instanz von "ObjectBuilder" hat, kann Ihr "ObjectA" ändern. Wenn Sie ein veränderbares Objekt haben möchten, brauchen Sie den Builder nicht: Sie müssen nur Ihre "ObjectA" setzen. –

+0

Das ist eine ziemlich gute Antwort. Es stimmt, ich möchte nicht, dass A nach dem Konstruktor geändert wird. Deshalb habe ich den Erbauer von Anfang an benutzt. –

Antwort

7

Ein großer Grund, einen Builder für die Verwendung ist um einen unveränderlichen Gegenstand zu bauen: der Erbauer ist veränderlich, das Ding, das er baut, ist nicht (notwendigerweise).

Wenn Sie an den Builder delegieren, wäre Ihre Instanz wieder änderbar: Jeder, der einen Verweis auf dieselbe Instanz von ObjectBuilder hat, kann Ihre ObjectA ändern. Dies bedeutet, dass alle Überprüfungen, die Sie zur Zeit der Erstellung des Status des ObjectA durchführen, für ungültig erklärt werden können.

Wenn Sie ein veränderbares Objekt wünschen, brauchen Sie den Builder nicht: Sie müssen nur ObjectA setzen.

+2

Wenn Sie ein veränderbares Objekt möchten, benötigen Sie _less_ für den Builder. Builder sind gut für mehr als nur Unveränderlichkeit. – jaco0646

+0

@AndyTurner Ich habe ähnliche Frage zum Builder-Muster [hier] (http://stackoverflow.com/questions/41206286/how-to-clone-old-builder-to-make-a-new-builder-object). Ich wollte sehen, ob du mir da drüben helfen kannst. –

Verwandte Themen