В паттерне "Строитель" методы должны возвращать 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;
    }
}

Ответы (0 шт):