Gymterview
junior

Что такое паттерн Builder?

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

Аналогия из жизни: Builder – как конструктор бургера в приложении доставки. Вы выбираете булочку, котлету, соус и добавки шаг за шагом, а в конце нажимаете “Заказать” – и получаете готовый бургер.

Ручной Builder
public class HttpRequest {
    private final String url;
    private final String method;
    private final Map<String, String> headers;
    private final String body;

    private HttpRequest(Builder builder) {
        this.url = builder.url;
        this.method = builder.method;
        this.headers = Map.copyOf(builder.headers);
        this.body = builder.body;
    }

    public static class Builder {
        private final String url;       // обязательный
        private String method = "GET";  // по умолчанию
        private final Map<String, String> headers = new HashMap<>();
        private String body;

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

        public Builder method(String method) { this.method = method; return this; }
        public Builder header(String key, String value) { headers.put(key, value); return this; }
        public Builder body(String body) { this.body = body; return this; }

        public HttpRequest build() {
            if (url == null) throw new IllegalStateException("URL is required");
            return new HttpRequest(this);
        }
    }
}

// Использование -- читаемо, невозможно забыть обязательные параметры
HttpRequest request = new HttpRequest.Builder("https://api.example.com")
    .method("POST")
    .header("Content-Type", "application/json")
    .body("{\"name\": \"John\"}")
    .build();
Пример
// Lombok @Builder -- генерирует Builder автоматически
@Builder
@Value // immutable
public class UserDto {
    String name;
    String email;
    int age;
}

UserDto user = UserDto.builder()
    .name("John")
    .email("john@mail.com")
    .age(30)
    .build();

Важное

  • Builder решает проблему “телескопического конструктора” (много параметров, часть optional)
  • Объект, созданный Builder, обычно immutable
  • Lombok @Builder – стандарт в Spring-проектах для DTO

Частые ошибки

  • Builder для объекта с 2 полями – over-engineering; достаточно конструктора или record
  • Мутабельный объект после build() – Builder должен создавать immutable объект
  • Повторное использование Builder – после build() Builder не должен использоваться повторно

Как используется в 2026

  • Lombok @Builder – повсеместно в Spring-проектах
  • Java Records – для простых DTO без Builder; Builder – для объектов с optional полями
  • Fluent API в JDK: HttpClient.newBuilder(), HttpRequest.newBuilder(), ProcessBuilder

На собеседовании: покажите, что понимаете, когда Builder нужен (много optional-параметров, immutable-объект), а когда избыточен (2-3 поля – достаточно record). Частая ошибка – не упомянуть Lombok и писать Builder вручную в 2026 году.