Ho visto molte implementazioni del modello Builder (principalmente in Java). Tutti hanno una classe di entità (diciamo una Person
classe) e una classe builder PersonBuilder
. Il builder "impila" una varietà di campi e restituisce a new Person
con gli argomenti passati. Perché abbiamo esplicitamente bisogno di una classe builder, invece di mettere tutti i metodi builder nella Person
classe 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 PersonBuilder
lezione?
L'unico vantaggio che vedo è che possiamo dichiarare i Person
campi come final
, garantendo così l'immutabilità.
withName
una 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).
void
metodi. Quindi, ad esempio se Person
ha 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 this
alla fine della sua esecuzione ed è abbastanza chiaro. Quindi, un Builder farà anche un'interfaccia fluida.
chainable setters
: D