He visto muchas implementaciones del patrón Builder (principalmente en Java). Todos ellos tienen una clase de entidad (digamos una Person
clase) y una clase de generador PersonBuilder
. El constructor "apila" una variedad de campos y devuelve un new Person
con los argumentos pasados. ¿Por qué necesitamos explícitamente una clase de generador, en lugar de poner todos los métodos de generador en la Person
clase misma?
Por ejemplo:
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;
}
}
Simplemente puedo decir Person john = new Person().withName("John");
¿Por qué la necesidad de una PersonBuilder
clase?
El único beneficio que veo es que podemos declarar los Person
campos como final
, asegurando así la inmutabilidad.
withName
devolver una copia de la Persona con solo el campo de nombre cambiado. En otras palabras, Person john = new Person().withName("John");
podría funcionar incluso si Person
es inmutable (y este es un patrón común en la programación funcional).
void
métodos. Entonces, por ejemplo, si Person
tiene un método que imprime su nombre, aún puede encadenarlo con una interfaz fluida person.setName("Alice").sayName().setName("Bob").sayName()
. Por cierto, anoto aquellos en JavaDoc con exactamente su sugerencia @return Fluent interface
: es lo suficientemente genérico y claro cuando se aplica a cualquier método que lo hace return this
al final de su ejecución y es bastante claro. Por lo tanto, un generador también estará haciendo una interfaz fluida.
chainable setters
: D