Билдер (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()
, который возвращает наш объект.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.