Какой паттерн проектирования удобен для создания сложных объектов с множеством параметров?

«Какой паттерн проектирования удобен для создания сложных объектов с множеством параметров?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Для создания сложных объектов с множеством опциональных параметров удобен паттерн Builder.

Почему? Он решает проблему "телескопического конструктора" (множество перегруженных версий) и делает код чище и читаемее, особенно когда не все параметры обязательны.

Пример на Java:

public class User {
    private final String name;
    private final int age;
    private final String email;

    // Приватный конструктор, вызывается Builder'ом
    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public static class Builder {
        private final String name; // Обязательный параметр
        private int age = 0;       // Необязательный, со значением по умолчанию
        private String email = ""; // Необязательный, со значением по умолчанию

        public Builder(String name) {
            this.name = name;
        }

        public Builder age(int age) {
            this.age = age;
            return this; // Возвращает this для fluent-интерфейса
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

// Использование:
User user = new User.Builder("Alice")
                    .age(30)
                    .email("alice@example.com")
                    .build();

Ключевые преимущества:

  • Читаемость: Имена методов явно указывают, какой параметр устанавливается.
  • Неизменяемость: Объект User можно сделать immutable (с final полями).
  • Безопасность: Объект создается полностью инициализированным и валидным.
  • Гибкость: Легко добавлять новые параметры, не ломая существующий код.