Я видел много реализаций шаблона Builder (в основном на Java). Все они имеют класс сущности (скажем, Personкласс) и класс строителя PersonBuilder. Конструктор "складывает" различные поля и возвращает a new Personс переданными аргументами. Зачем нам явно нужен класс построителя вместо того, чтобы помещать все методы построителя в сам Personкласс?
Например:
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;
}
}
Я могу просто сказать Person john = new Person().withName("John");
Зачем нужен PersonBuilderкласс?
Единственное преимущество, которое я вижу, это то, что мы можем объявить Personполя как final, обеспечивая тем самым неизменность.
withNameвернуть копию Человека только с измененным полем имени. Другими словами, Person john = new Person().withName("John");может работать, даже если Personявляется неизменным (и это распространенная модель в функциональном программировании).
voidметодов. Так, например, если Personесть метод, который печатает их имя, вы все равно можете связать его с помощью интерфейса Fluent person.setName("Alice").sayName().setName("Bob").sayName(). Кстати, я аннотирую их в JavaDoc именно вашим предложением @return Fluent interface- оно достаточно общее и понятное, когда оно применяется к любому методу, который делает return thisв конце своего выполнения, и это довольно ясно. Таким образом, Builder также будет свободно работать с интерфейсом.
chainable setters: D