В паттерне "Строитель" методы должны возвращать this или нет?
Изучаю паттерны. Смотрю примеры. И вот например на ресурсе https://howtodoinjava.com/design-patterns/creational/builder-pattern-in-java/
каждый метод билдера возвращает this, чтобы можно было выстраивать методы в цепочку.
User user1 = new User.UserBuilder("Lokesh", "Gupta")
.age(30)
.phone("1234567")
.address("Fake address 1234")
.build();
А на ресурсе https://refactoring.guru/ru/design-patterns/builder/csharp/example#example-0 методы void и получается надо писать так:
var builder = new ConcreteBuilder();
builder.BuildPartA();
builder.BuildPartC();
builder.BuildPartD();
builder.BuildPartE();
Мне не ясно, как правильно? С одной стороны цепочка очень удобна, а каждый раз писать билдер.МЕТОД() излишняя трата времени программиста и текста и места в редакторе) С другой стороны первый вариант неимутабельный и с этим могут быть проблемы. Хотя наверное второй тоже.
В итоге - как верно? Или на этот вопрос нет однозначного ответа? Я думал если есть паттерны, то там уже всё стандартизированно и фиксированно. А оказалось, что нет. А может на этих ресурсах вообще не правильные строители?
Пример из первого ресурса:
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
//Return the finally consrcuted User object
public User build() {
User user = new User(this);
validateUserObject(user);
return user;
}
}
Пример из второго ресурса
public interface IBuilder {
void BuildPartA();
void BuildPartB();
void BuildPartC();
}
public class ConcreteBuilder : IBuilder {
private Product _product = new Product();
public ConcreteBuilder() {
this.Reset();
}
public void Reset() {
this._product = new Product();
}
public void BuildPartA() {
this._product.Add("PartA1");
}
public void BuildPartB() {
this._product.Add("PartB1");
}
public void BuildPartC() {
this._product.Add("PartC1");
}
public Product GetProduct() {
Product result = this._product;
this.Reset();
return result;
}
}