Ho visto molte implementazioni del modello Builder (principalmente in Java). Tutti hanno una classe di entità (diciamo una Personclasse) e una classe builder PersonBuilder. Il builder "impila" una varietà di campi e restituisce a new Personcon gli argomenti passati. Perché abbiamo esplicitamente bisogno di una classe builder, invece di mettere tutti i metodi builder nella Personclasse stessa?
Per esempio:
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;
}
}
Posso semplicemente dire Person john = new Person().withName("John");
Perché la necessità di una PersonBuilderlezione?
L'unico vantaggio che vedo è che possiamo dichiarare i Personcampi come final, garantendo così l'immutabilità.
withNameuna copia della Persona con solo il campo del nome modificato. In altre parole, Person john = new Person().withName("John");potrebbe funzionare anche se Personè immutabile (e questo è un modello comune nella programmazione funzionale).
voidmetodi. Quindi, ad esempio se Personha un metodo che stampa il suo nome, puoi comunque concatenarlo con un'interfaccia fluidaperson.setName("Alice").sayName().setName("Bob").sayName() . A proposito, annoto quelli in JavaDoc con esattamente il tuo suggerimento @return Fluent interface: è generico e abbastanza chiaro quando si applica a qualsiasi metodo che fa return thisalla fine della sua esecuzione ed è abbastanza chiaro. Quindi, un Builder farà anche un'interfaccia fluida.
chainable setters: D