Я видел много реализаций шаблона 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