Sobes.tech
Back to questions
Junior — Middle
57

Можешь привести примеры применения паттерна Builder в Java и объяснить его особенности?

Answer from AI

sobes.tech AI

Паттерн Builder в Java используется для поэтапного создания сложных объектов с множеством параметров, особенно когда конструктор с большим числом аргументов неудобен или приводит к ошибкам.

Особенности:

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

Пример:

public class User {
    private final String firstName; // обязательный
    private final String lastName;  // обязательный
    private final int age;          // необязательный
    private final String phone;     // необязательный
    private final String address;   // необязательный

    private User(UserBuilder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public static class UserBuilder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public UserBuilder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public UserBuilder age(int age) {
            this.age = age;
            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("Иван", "Иванов")
                    .age(30)
                    .phone("123456789")
                    .build();

Такой подход делает код создания объекта гибким и понятным.