He visto muchas implementaciones del patrón Builder (principalmente en Java). Todos ellos tienen una clase de entidad (digamos una Personclase) y una clase de generador PersonBuilder. El constructor "apila" una variedad de campos y devuelve un new Personcon los argumentos pasados. ¿Por qué necesitamos explícitamente una clase de generador, en lugar de poner todos los métodos de generador en la Personclase 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 PersonBuilderclase?
El único beneficio que veo es que podemos declarar los Personcampos como final, asegurando así la inmutabilidad.
withNamedevolver 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 Persones inmutable (y este es un patrón común en la programación funcional).
voidmétodos. Entonces, por ejemplo, si Persontiene 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 thisal final de su ejecución y es bastante claro. Por lo tanto, un generador también estará haciendo una interfaz fluida.
chainable setters: D