Найти в Дзене
Записки о Java

Builder Pattern в Java

Поговорим о ещё одном важном шаблоне проектирования — Builder Pattern (паттерн «Строитель»). Он идеально подходит, когда вы создаёте сложные объекты с множеством опциональных параметров.
Забудьте про конструкторы с 10 аргументами! Builder придёт на помощь. Разберём: Builder Pattern — это порождающий шаблон проектирования, который позволяет пошагово создавать сложные объекты.
Он особенно полезен, когда: Представим, что у нас есть класс Laptop: Если мы будем создавать конструкторы для всех комбинаций: Это кошмар поддержки кода! Перепишем Laptop с использованием Builder. Представь, что ты собираешь робота из конструктора.
У тебя есть коробка с деталями: Ты не можешь просто сказать: «Хочу робота!» — и получить всё сразу. Вместо этого ты говоришь: Каждый шаг — это как один метод в Builder.
А когда ты говоришь: «Готово!» — робот собран. Builder — это как инструкция по сборке игрушки, шаг за шагом.
Ты решаешь, что добавить, а что оставить. Используйте Builder, когда: Не стоит использовать: Bu
Оглавление
Рисунок: Builder Pattern в Java
Рисунок: Builder Pattern в Java

Введение

Поговорим о ещё одном важном шаблоне проектирования — Builder Pattern (паттерн «Строитель»). Он идеально подходит, когда вы создаёте сложные объекты с множеством опциональных параметров.
Забудьте про конструкторы с 10 аргументами! Builder придёт на помощь.

Разберём:

  • Что такое Builder Pattern
  • Зачем он нужен
  • Пример на Java с пояснениями

Что такое Builder Pattern?

Builder Pattern — это порождающий шаблон проектирования, который позволяет пошагово создавать сложные объекты.
Он особенно полезен, когда:

  • У объекта много полей
  • Некоторые поля необязательные
  • Нужно избежать «телескопических конструкторов» (вроде new Car(a, b, c, d, e, f, g))

Проблема: Телескопические конструкторы

Представим, что у нас есть класс Laptop:

Рисунок: класс Laptop с множеством полей
Рисунок: класс Laptop с множеством полей

Если мы будем создавать конструкторы для всех комбинаций:

Рисунок: стандартный подход к созданию конструкторов для класса с большим набором полей
Рисунок: стандартный подход к созданию конструкторов для класса с большим набором полей

Это кошмар поддержки кода!

Решение: Builder Pattern

Перепишем Laptop с использованием Builder.

Шаг 1: Создадим класс Laptop с приватным конструктором

Рисунок: класс Laptop
Рисунок: класс Laptop
Рисунок: класс Laptop
Рисунок: класс Laptop

Шаг 2: Вложенный статический Builder

Рисунок: вложенный статический Builder часть 1
Рисунок: вложенный статический Builder часть 1
Рисунок: вложенный статический Builder часть 2
Рисунок: вложенный статический Builder часть 2
Рисунок: вложенный статический Builder часть 3
Рисунок: вложенный статический Builder часть 3

Объясняю, как пятилетнему ребёнку

Представь, что ты собираешь робота из конструктора.
У тебя есть коробка с деталями:

  • Голова
  • Руки (можно две, можно шесть!)
  • Ноги (можно колёсики вместо ног)
  • Антенна
  • Лазерные глаза (по желанию!)

Ты не можешь просто сказать:

«Хочу робота!» — и получить всё сразу.

Вместо этого ты говоришь:

  1. Берём корпус
  2. Добавляем голову
  3. Две руки
  4. Колёсики вместо ног
  5. Антенну сверху
  6. И... лазерные глаза!

Каждый шаг — это как один метод в Builder.
А когда ты говоришь:
«Готово!» — робот собран.

Builder — это как инструкция по сборке игрушки, шаг за шагом.
Ты решаешь, что добавить, а что оставить.

Когда использовать Builder?

Используйте Builder, когда:

  • У объекта много параметров
  • Есть опциональные поля
  • Хотите избежать путаницы в конструкторах
  • Нужна неизменяемость (immutable objects)

Не стоит использовать:

  • Для объектов с 1–2 полями
  • В простых DTO без логики

Вывод

Builder Pattern — это как мастер-строитель в вашем коде.
Он берёт на себя всю работу по созданию сложного объекта, позволяя вам сконцентрироваться на том,
какой объект вы хотите получить, а не на том, как его создать.

Примеры, рассмотренные в статье, можно найти по адресу:

https://github.com/ShkrylAndrei/blog_yandex/tree/main/src/main/java/info/shkryl/pattern/builder