← Назад к вопросам

Что такое процесс создания объекта с использованием паттерна Builder?

1.8 Middle🔥 251 комментариев
#SOLID и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Паттерн Builder

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

Проблема, которую решает Builder

Представь, что у тебя есть класс User с полями: имя, фамилия, email, телефон, адрес, страна, город и т.д. Все поля опциональные. Если писать конструкторы, получится перегрузка:

public User(String name, String surname) {}
public User(String name, String surname, String email) {}
public User(String name, String surname, String email, String phone) {}
// ... и ещё 20 вариантов

Это грязно и неудобно. Здесь приходит на помощь Builder.

Как работает Builder

Builder создаёт промежуточный объект, который знает, как конструировать целевой объект. Процесс выглядит так:

public class User {
    private String name;
    private String surname;
    private String email;
    private String phone;
    private String address;
    
    // Приватный конструктор — нельзя создать User напрямую
    private User(UserBuilder builder) {
        this.name = builder.name;
        this.surname = builder.surname;
        this.email = builder.email;
        this.phone = builder.phone;
        this.address = builder.address;
    }
    
    // Статический класс Builder
    public static class UserBuilder {
        private String name;
        private String surname;
        private String email;
        private String phone;
        private String address;
        
        public UserBuilder(String name, String surname) {
            this.name = name;
            this.surname = surname;
        }
        
        public UserBuilder email(String email) {
            this.email = email;
            return this;
        }
        
        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }
        
        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }
        
        public User build() {
            return new User(this);
        }
    }
}

Использование

User user = new User.UserBuilder("Иван", "Иванов")
    .email("ivan@example.com")
    .phone("+7 (999) 999-99-99")
    .address("Москва, ул. Примера 1")
    .build();

Преимущества Builder

  1. Читаемость кода — очень понятно, что создаётся
  2. Гибкость — можно опустить любые опциональные параметры
  3. Безопасность — объект создан корректно, после build() его нельзя менять (если сделать getters без setters)
  4. Immutability — объекты неизменяемы, что хорошо для многопоточности
  5. Упрощение кода — нет множества перегруженных конструкторов

В реальной жизни

Builder используется везде:

  • HTTP запросы: HttpClient.newHttpClient() и HttpRequest.newBuilder()
  • StringBuilder: классический пример для строк
  • Lombok: аннотация @Builder автоматически генерирует класс
  • ORM: Hibernate QueryBuilder, JPA CriteriaBuilder
  • JSON: Jackson, Gson и другие библиотеки используют Builder для построения объектов

Альтернатива: Телескопирующие конструкторы vs Builder

Телескопирующие конструкторы (плохо):

public User(String name, String surname) {}
public User(String name, String surname, String email) {}
public User(String name, String surname, String email, String phone) {}

Builder (хорошо) — код становится понятнее и масштабируется.

Выводы

Builder — это мощный и элегантный паттерн для создания сложных объектов. Его используют все крупные Java-фреймворки. Если у класса много параметров конструктора (более 3-4), подумай о Builder.

Что такое процесс создания объекта с использованием паттерна Builder? | PrepBro