J'ai vu de nombreuses implémentations du modèle Builder (principalement en Java). Tous ont une classe d'entité (disons une Personclasse) et une classe de constructeur PersonBuilder. Le générateur "empile" une variété de champs et renvoie un new Personavec 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 Personclasse 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 PersonBuilderclasse?
Le seul avantage que je vois, c'est que nous pouvons déclarer les Personchamps comme final, assurant ainsi l'immuabilité.
withNamerenvoyé 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 Personest immuable (et c'est un modèle courant en programmation fonctionnelle).
voidméthodes. Ainsi, par exemple, si Persona 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