Что такое паттерн Singleton и как он реализуется?

«Что такое паттерн Singleton и как он реализуется?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Базовая реализация на Java (ленивая, не потокобезопасная):

public class Singleton {
    // Статическая переменная для хранения единственного экземпляра
    private static Singleton instance;

    // Приватный конструктор блокирует создание объектов через new
    private Singleton() {
        // Инициализация
    }

    // Публичный статический метод для получения экземпляра
    public static Singleton getInstance() {
        if (instance == null) { // Ленивая инициализация
            instance = new Singleton();
        }
        return instance;
    }
}

Проблемы и улучшения:

  1. Потокобезопасность: Базовая реализация не безопасна для многопоточности. Два потока могут одновременно пройти проверку instance == null и создать два экземпляра.
  2. Потокобезопасная реализация с synchronized:
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    Недостаток: Синхронизация всего метода снижает производительность.

  3. Реализация через статическое поле (Eager Initialization):
    private static final Singleton instance = new Singleton();
    public static Singleton getInstance() { return instance; }

    Плюс: Потокобезопасна. Минус: Экземпляр создается при загрузке класса, даже если он не используется.

Типичные случаи использования: Логгеры, подключения к базам данных, кеши, конфигурационные объекты, пулы потоков.