Билдер (Builder) это шаблон проектирования, который используется там, где есть необходимость постепенного создания объекта, таким образом, чтобы гарантировалась его целостность, то есть то, что он создан целиком и полностью так, как это предполагалось.
Рассмотрим этот шаблон на примере конфигуратора машины. Возможно, вы встречались с таким на сайте автопроизводителей, когда они предлагают собрать свою версию машину выбрав цвет, кузов, версию двигателя, дополнительные опции и тому подобное.
Для реализации подобного конфигуратора нам понадобится класс описывающий машину со всеми возможными опциями. В процессе работы будет создаваться объект этого класса, который затем наполняется нужными данными. Так как данные появляются не одновременно, а по мере работы с конфигуратором, то основной способ наполнения объектов этого класса будет через сеттеры, а не через конструктор.
import lombok.Builder;
import lombok.Data;
@Data
public class Car { // Ford
    private String model;
    private String engine;
    private String interior;
    private boolean hasSunroof;
    private String color = "Black";
}
Пример использования:
public class Main {
    public static void main(String[] args) {
        var car = new Car();
        car.setModel("Mustang")
        car.setEngine("3.6")
        car.setInterior("Leather")
        car.setHasSunroof(true)
        car.setColor("Silver Metallic")
        System.out.println(car);
    }
}
Это абсолютно рабочий подход, но в некоторых ситуациях, он может приводить к проблеме. Так как объект заполняется постепенно, то вполне возможно, что он не будет заполнен правильно до конца. В идеале хотелось бы создать объект через конструктор передав туда сразу все обязательные параметры.
var car = new Car("Mustang", "3.6", "Leather", true, "Silver Metallic");
В таком случае мы можем пойти следующим путем. Начнем собирать данные в другом объекте, который в конце процесса сбора данных создаст нужный объект Car. Гипотетический код может выглядеть так:
// Используется текучий интерфейс (fluent interface)
var car = new CarBuilder()
    .model("Mustang")
    .engine("3.6")
    .interior("Leather")
    .hasSunroof(true)
    .color("Silver Metallic")
    .build(); // Вызывает new Car() передавая туда все параметры
Это и есть реализация шаблона проектирования Builder. Этот код, даже не придется писать самостоятельно, Lombok включает аннотацию @Builder, которая добавляет билдер прямо в наш класс.
@Builder
@Data
public class Car {
    // Код класса
}
И использование:
var car = Car.builder()
    .model("Mustang")
    .engine("3.6")
    .interior("Leather")
    .hasSunroof(true)
    .color("Silver Metallic")
    .build();
Здесь вначале вызывается статический метод builder(), который возвращает объект для сборки. Затем, после того как объект собран вызывается build(), который возвращает наш объект.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.