← Назад к вопросам

Какой любимый паттерн проектирования?

1.0 Junior🔥 91 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Любимый паттерн проектирования: 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 код (лишнее выделение памяти)

Почему это мой любимый паттерн

  1. Повсеместно используется в modern Java (OkHttp, Retrofit, Spring, Lombok)
  2. Решает реальные проблемы — множество параметров, опциональность
  3. Безопасность — неизменяемость, валидация
  4. Читаемость — код понятен даже новичкам
  5. Расширяемость — легко добавлять новые параметры без breaking changes

Это паттерн, который я вижу в каждом серьёзном Java проекте. На то есть веские причины — он работает.

Какой любимый паттерн проектирования? | PrepBro