Skip to main content

Що таке патерн Singleton?

Singleton (Одинак) - це породжувальний патерн проєктування, який гарантує, що в програмі існуватиме лише один екземпляр певного класу, і надає до нього глобальну точку доступу.

Основна ідея

Деякі об'єкти логічно повинні існувати в єдиному екземплярі: наприклад, конфігурація застосунку, логер, пул підключень до бази даних, системний кеш. Патерн Singleton контролює створення об'єкта так, щоб програма не могла створити більше однієї копії цього класу.


Ключові ознаки

  1. Приватний конструктор - щоб ніхто не міг створити об'єкт напряму через new.
  2. Статичне поле - зберігає єдиний екземпляр класу.
  3. Публічний статичний метод - повертає цей екземпляр (або створює при першому зверненні).

Приклад (на Java)

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:
java
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) - екземпляр створюється одразу під час завантаження класу:
java
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }

Переваги

  • Контроль кількості екземплярів.
  • Глобальна точка доступу.
  • Економія ресурсів (якщо створення затратне).

Недоліки

  • Важко тестувати (глобальний стан).
  • Порушує принцип єдиної відповідальності (клас сам керує своїм життєвим циклом).
  • Може спричиняти приховані залежності між компонентами.
  • У багатопотоковому середовищі вимагає синхронізації.

Коли використовувати

  • Коли потрібен один об'єкт для керування спільним ресурсом (наприклад, логування, кеш, конфігурація).
  • Коли потрібен централізований доступ до стану.

Аналогія

Уяви, що в місті є один мер. Він керує всіма питаннями, і в громадян немає можливості створити ще одного. У цьому й полягає суть Singleton - єдиний керуючий об'єкт у системі.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.