Я бачив багато реалізацій шаблону Builder (головним чином на Java). Усі вони мають клас сутності (скажімо, Person
клас) та клас будівельника PersonBuilder
. Конструктор "укладає" різні поля та повертає a new Person
із переданими аргументами. Чому нам явно потрібен клас будівельника, а не розміщення всіх методів builder у самому 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 Interface person.setName("Alice").sayName().setName("Bob").sayName()
. До речі, я коментую їх у JavaDoc саме за вашою пропозицією @return Fluent interface
- це загальний і досить зрозумілий характер, коли він застосовується до будь-якого методу, який return this
є в кінці його виконання, і це досить зрозуміло. Отже, Builder також буде робити вільний інтерфейс.
chainable setters
: D