Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке патерн Singleton?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Singleton (Одинак)** - це породжувальний патерн проєктування, який гарантує, що в програмі існуватиме лише один екземпляр певного класу, і надає до нього глобальну точку доступу. **Ключове:** Приватний конструктор і публічний статичний метод `getInstance()` не дозволяють створити об'єкт напряму через `new`, тому клас завжди повертає той самий екземпляр.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**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 - **єдиний керуючий об'єкт** у системі.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.