Що таке патерн Singleton?
Singleton (Одинак) - це породжувальний патерн проєктування, який гарантує, що в програмі існуватиме лише один екземпляр певного класу, і надає до нього глобальну точку доступу.
Основна ідея
Деякі об'єкти логічно повинні існувати в єдиному екземплярі: наприклад, конфігурація застосунку, логер, пул підключень до бази даних, системний кеш. Патерн Singleton контролює створення об'єкта так, щоб програма не могла створити більше однієї копії цього класу.
Ключові ознаки
- Приватний конструктор - щоб ніхто не міг створити об'єкт напряму через
new. - Статичне поле - зберігає єдиний екземпляр класу.
- Публічний статичний метод - повертає цей екземпляр (або створює при першому зверненні).
Приклад (на Java)
public class Singleton {
private static Singleton instance; // єдиний екземпляр
private Singleton() {} // приватний конструктор
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // ліниве створення
}
return instance;
}
}Потокобезпечна версія
У багатопотоковому середовищі можлива ситуація, коли два потоки одночасно створюють екземпляр. Рішення:
- Використати synchronized на методі
getInstance(). - Або застосувати Double Checked Locking:
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
}- Або скористатися ініціалізацією через статичний блок (Eager initialization) - екземпляр створюється одразу під час завантаження класу:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}Переваги
- Контроль кількості екземплярів.
- Глобальна точка доступу.
- Економія ресурсів (якщо створення затратне).
Недоліки
- Важко тестувати (глобальний стан).
- Порушує принцип єдиної відповідальності (клас сам керує своїм життєвим циклом).
- Може спричиняти приховані залежності між компонентами.
- У багатопотоковому середовищі вимагає синхронізації.
Коли використовувати
- Коли потрібен один об'єкт для керування спільним ресурсом (наприклад, логування, кеш, конфігурація).
- Коли потрібен централізований доступ до стану.
Аналогія
Уяви, що в місті є один мер. Він керує всіма питаннями, і в громадян немає можливості створити ще одного. У цьому й полягає суть Singleton - єдиний керуючий об'єкт у системі.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.