Eu já vi muitas implementações do padrão Builder (principalmente em Java). Todos eles têm uma classe de entidade (digamos, uma Person
classe) e uma classe de construtor PersonBuilder
. O construtor "empilha" uma variedade de campos e retorna a new Person
com os argumentos passados. Por que precisamos explicitamente de uma classe de construtor, em vez de colocar todos os métodos de construtor na Person
própria classe?
Por exemplo:
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;
}
}
Eu posso simplesmente dizer Person john = new Person().withName("John");
Por que a necessidade de uma PersonBuilder
aula?
O único benefício que vejo é que podemos declarar os Person
campos como final
, garantindo assim a imutabilidade.
withName
devolver uma cópia da Pessoa com apenas o campo de nome alterado. Em outras palavras, Person john = new Person().withName("John");
poderia funcionar mesmo que Person
seja imutável (e esse é um padrão comum na programação funcional).
void
métodos. Portanto, por exemplo, se Person
houver um método que imprima o nome deles, você ainda poderá encadear uma interface fluente person.setName("Alice").sayName().setName("Bob").sayName()
. A propósito, eu anoto aqueles no JavaDoc exatamente com a sua sugestão @return Fluent interface
- é genérico e claro o suficiente quando se aplica a qualquer método que faça return this
no final de sua execução e é bastante claro. Portanto, um construtor também fará uma interface fluente.
chainable setters
: D