Какой паттерн проектирования вы используете чаще всего?

«Какой паттерн проектирования вы используете чаще всего?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чаще всего используется паттерн Singleton (Одиночка). Он обеспечивает создание единственного экземпляра класса и глобальную точку доступа к нему.

Применение: Управление общими ресурсами — конфигурация приложения, логгер, пул соединений с базой данных.

Пример реализации на Java:

public class DatabaseConnection {
    private static DatabaseConnection instance;
    private Connection connection;

    private DatabaseConnection() {
        // Приватный конструктор
    }

    public static synchronized DatabaseConnection getInstance() {
        if (instance == null) {
            instance = new DatabaseConnection();
        }
        return instance;
    }

    public Connection getConnection() {
        return connection;
    }
}

Ключевые аспекты и best practices:

  1. Потокобезопасность: Базовая реализация требует синхронизации (synchronized). Более эффективные варианты:
    • Double-Checked Lockingvolatile).
    • Статическая инициализация (private static final Singleton instance = new Singleton();).
    • Enum Singleton (рекомендовано Джошуа Блохом).
  2. Ленивая (Lazy) vs. Ранняя (Eager) инициализация: Singleton может создаваться при первом вызове getInstance() (ленивая) или при загрузке класса (ранняя).
  3. Проблемы: Усложняет модульное тестирование из-за глобального состояния и скрытых зависимостей.
  4. Современные альтернативы: Внедрение зависимостей (Dependency Injection, например, через Spring), где «одиночка» управляется контейнером IoC.