Я бачив багато реалізацій шаблону 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