Builder — это порождающий паттерн, который позволяет создавать сложные объекты пошагово, разделяя процесс конструирования и представление.
Простыми словами: вместо конструктора с десятком параметров, вы собираете объект по частям, вызывая понятные методы.
▪️ Пример:
HTTP-клиент с множеством необязательных настроек: таймауты, заголовки, ретраи, прокси. Конструктор с 10 параметрами нечитаем, а Builder решает это.
public 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 = builder.headers;
this.maxRetries = builder.maxRetries;
}
public static class Builder {
private final String baseUrl; // обязательный
private int connectTimeout = 5000; // значение по умолчанию
private int readTimeout = 10000;
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() {
return new HttpClient(this);
}
}
}
// Использование
HttpClient client = new HttpClient.Builder("https://api.example.com")
.connectTimeout(3000)
.header("Authorization", "Bearer token")
.maxRetries(5)
.build();▪️ Когда использовать
— Объект имеет множество параметров (особенно необязательных)
— Нужна immutable-объект с удобным созданием
— Хотите избежать telescoping constructor (конструктор в конструкторе)
▪️ Builder vs конструктор
— Конструктор: подходит, если параметров 2–3 и все обязательные
— Builder: если параметров больше 4 или есть необязательные
▪️ Минус
Дублирование полей между классом и билдером. Lombok @Builder решает это автоматически.
🐸 Библиотека собеса по Java
#patterns