J'ai vu de nombreuses implémentations du modèle Builder (principalement en Java). Tous ont une classe d'entité (disons une Person
classe) et une classe de constructeur PersonBuilder
. Le générateur "empile" une variété de champs et renvoie un new Person
avec les arguments passés. Pourquoi avons-nous explicitement besoin d'une classe de générateur, au lieu de mettre toutes les méthodes de générateur dans la Person
classe elle-même?
Par exemple:
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;
}
}
Je peux simplement dire Person john = new Person().withName("John");
Pourquoi le besoin d'une PersonBuilder
classe?
Le seul avantage que je vois, c'est que nous pouvons déclarer les Person
champs comme final
, assurant ainsi l'immuabilité.
withName
renvoyé une copie de la personne avec seulement le champ de nom changé. En d'autres termes, cela Person john = new Person().withName("John");
pourrait fonctionner même s'il Person
est immuable (et c'est un modèle courant en programmation fonctionnelle).
void
méthodes. Ainsi, par exemple, si Person
a une méthode qui imprime leur nom, vous pouvez toujours la chaîner avec une interface Fluent person.setName("Alice").sayName().setName("Bob").sayName()
. Soit dit en passant, j'annote ceux de JavaDoc avec exactement votre suggestion @return Fluent interface
- c'est générique et assez clair quand il s'applique à n'importe quelle méthode qui le fait return this
à la fin de son exécution et c'est assez clair. Ainsi, un constructeur fera également une interface fluide.
chainable setters
: D