Ich habe viele Implementierungen des Builder-Musters gesehen (hauptsächlich in Java). Alle von ihnen haben eine Entity-Klasse (sagen wir eine PersonKlasse) und eine Builder-Klasse PersonBuilder. Der Builder "stapelt" verschiedene Felder und gibt ein new Personmit den übergebenen Argumenten zurück. Warum benötigen wir explizit eine Builder-Klasse, anstatt alle Builder-Methoden in der PersonKlasse selbst zu platzieren?
Beispielsweise:
class Person {
private String name;
private Integer age;
public Person() {
}
Person withName(String name) {
this.name = name;
return this;
}
Person withAge(int age) {
this.age = age;
return this;
}
}
Ich kann es einfach sagen Person john = new Person().withName("John");
Warum braucht man eine PersonBuilderKlasse?
Der einzige Vorteil, den ich sehe, ist, dass wir die PersonFelder als deklarieren können, um die finalUnveränderlichkeit zu gewährleisten.
withNameeine Kopie der Person zurücksenden, wobei nur das Namensfeld geändert wurde. Mit anderen Worten, Person john = new Person().withName("John");könnte funktionieren, auch wenn Personunveränderlich ist (und dies ist ein verbreitetes Muster in der funktionalen Programmierung).
voidMethoden. Wenn beispielsweise Personeine Methode ihren Namen ausgibt, können Sie sie dennoch mit einer Fluent-Schnittstelle verketten person.setName("Alice").sayName().setName("Bob").sayName(). Übrigens kommentiere ich die in JavaDoc mit genau Ihrem Vorschlag @return Fluent interface- es ist allgemein und klar genug, wenn es auf eine Methode angewendet wird, die return thisam Ende ihrer Ausführung ausgeführt wird, und es ist ziemlich klar. Ein Builder wird also auch eine flüssige Benutzeroberfläche erstellen.
chainable setters: D