Паттерн "Строитель" (Builder) в Java — сложная конфигурация без telescoping constructor
Базовый обзор паттерна — в порождающих паттернах. Здесь — практический Builder на Java для объекта с множеством опциональных настроек.
Задача паттерна
Builder разделяет процесс создания сложного объекта и его представление. Вместо конструктора с длинным списком аргументов клиент задаёт параметры шагами через понятные методы.
Паттерн помогает в трёх случаях:
- параметров много;
- часть параметров опциональна;
- объект должен остаться immutable после
build().
Пример — HTTP-клиент с настройками
import java.util.HashMap;
import java.util.Map;
public final class HttpClient {
private final String baseUrl;
private final int connectTimeout;
private final int readTimeout;
private final Map<String, String> headers;
private final int maxRetries;
private HttpClient(Builder builder) {
this.baseUrl = builder.baseUrl;
this.connectTimeout = builder.connectTimeout;
this.readTimeout = builder.readTimeout;
this.headers = Map.copyOf(builder.headers);
this.maxRetries = builder.maxRetries;
}
public static final class Builder {
private final String baseUrl;
private int connectTimeout = 5_000;
private int readTimeout = 10_000;
private Map<String, String> headers = new HashMap<>();
private int maxRetries = 3;
public Builder(String baseUrl) {
this.baseUrl = baseUrl;
}
public Builder connectTimeout(int ms) {
this.connectTimeout = ms;
return this;
}
public Builder readTimeout(int ms) {
this.readTimeout = ms;
return this;
}
public Builder header(String key, String value) {
this.headers.put(key, value);
return this;
}
public Builder maxRetries(int retries) {
this.maxRetries = retries;
return this;
}
public HttpClient build() {
if (baseUrl == null || baseUrl.isBlank()) {
throw new IllegalArgumentException("baseUrl обязателен");
}
return new HttpClient(this);
}
}
}
HttpClient client = new HttpClient.Builder("https://api.example.com")
.connectTimeout(3_000)
.header("Authorization", "Bearer token")
.maxRetries(5)
.build();
Map.copyOf(...) в конструкторе защищает от случайной мутации заголовков после сборки.
Builder и конструктор
| Подход | Когда подходит |
|---|---|
| Конструктор | 2-3 обязательных параметра, без множества опций |
| Builder | 4+ параметра, часть опциональна, нужен fluent API |
Telescoping constructor (new X(a,b,c,d,e,...)) хуже читается и чаще даёт ошибки порядка аргументов.
Когда использовать
- Конфигурации клиента API, подключения к БД, job-пайплайнов.
- DTO/command-объекты с множеством опций.
- immutable-модели, где нужна валидация перед созданием.
Риски и ограничения
Минус Builder — дублирование полей в Builder и в самом объекте.
В Java-проектах часто применяют Lombok @Builder, AutoValue или Immutables. Это ускоряет разработку, но не отменяет архитектурный выбор, когда Builder действительно нужен.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#