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

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


Дополнительные материалы

  1. Builder Lombok

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff