Зарегистрируйтесь, чтобы продолжить обучение

Билдер (Builder) Java: Объектно-ориентированный дизайн

Билдер (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(), который возвращает наш объект.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»