Какой любимый паттерн проектирования?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Любимый паттерн проектирования: Builder Pattern
Мой любимый паттерн — это Builder Pattern (Строитель). После 10+ лет разработки я вижу, как он решает реальные проблемы в production коде, и почему его используют опытные разработчики во всём мире.
Почему Builder нравится мне
1. Читаемость и выразительность кода
// БЕЗ Builder
public class Request {
public Request(String url, String method, Map<String, String> headers,
int timeout, boolean followRedirects, String body,
boolean validateSsl, int maxRetries, String userAgent) {
// 9 параметров — это уже ошибка
}
}
// С Builder
Request request = new Request.Builder()
.url("https://api.example.com/users")
.method("POST")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer token")
.body("{\"name\": \"John\"}")
.timeout(5000)
.followRedirects(true)
.validateSsl(true)
.maxRetries(3)
.userAgent("MyApp/1.0")
.build();
Читается как проза, сразу понятно что есть что.
2. Естественное обращение с опциональными параметрами
БЕЗ Builder нужны перегрузки конструкторов (взрыв комбинаторики). С Builder — один способ для всех комбинаций.
3. Неизменяемость (Immutability)
Builder создаёт неизменяемые объекты со всеми полями private final. Это критично для многопоточного кода и параллельной обработки.
Примеры из реальных фреймворков
OkHttp
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(Duration.ofSeconds(10))
.readTimeout(Duration.ofSeconds(30))
.writeTimeout(Duration.ofSeconds(30))
.retryOnConnectionFailure(true)
.build();
Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Lombok @Builder
@Builder
@Data
public class User {
private String firstName;
private String lastName;
private String email;
private String phone;
}
User user = User.builder()
.firstName("John")
.lastName("Doe")
.email("john@example.com")
.build();
Валидация данных в Builder
public class DatabaseConnection {
private final String host;
private final int port;
private DatabaseConnection(Builder builder) {
if (builder.port < 1 || builder.port > 65535) {
throw new IllegalArgumentException("Invalid port: " + builder.port);
}
if (builder.host == null || builder.host.isEmpty()) {
throw new IllegalArgumentException("Host is required");
}
this.host = builder.host;
this.port = builder.port;
}
public static class Builder {
private String host;
private int port = 5432;
public Builder host(String host) {
this.host = host;
return this;
}
public Builder port(int port) {
this.port = port;
return this;
}
public DatabaseConnection build() {
return new DatabaseConnection(this);
}
}
}
Валидация происходит в одном месте (в build()), это удобнее чем разбросанные проверки по конструктору.
Когда Builder особенно полезен
✅ Много параметров (> 3-4) ✅ Много опциональных параметров ✅ Нужна валидация ✅ Нужна неизменяемость ✅ Нужна читаемость
❌ Избегай Builder: ❌ Только 1-2 обязательных параметра ❌ Простая структура данных ❌ Performance critical код (лишнее выделение памяти)
Почему это мой любимый паттерн
- Повсеместно используется в modern Java (OkHttp, Retrofit, Spring, Lombok)
- Решает реальные проблемы — множество параметров, опциональность
- Безопасность — неизменяемость, валидация
- Читаемость — код понятен даже новичкам
- Расширяемость — легко добавлять новые параметры без breaking changes
Это паттерн, который я вижу в каждом серьёзном Java проекте. На то есть веские причины — он работает.