Патерн синглтон
Сінглтон (Singleton) — це креаційний патерн проектування, який гарантує, що клас матиме лише один екземпляр, доступний з будь-якої точки програми. Це особливо корисно для ресурсів, які повинні бути унікальними в межах програми: конфігурація, логгер, кеш тощо.
Чому потрібен Сінглтон:
Сінглтон забезпечує централізований спосіб управління ресурсами та надає універсальну "точку доступу" (екземпляр) до своєї функціональності.
Водночас він гарантує, що під час виконання програми не буде створено більше ніж один екземпляр об'єкта.
Коли застосовувати "Сінглтон"?
Обмежений ресурс
Коли потрібно працювати з ресурсом, який повинен існувати строго в одному екземплярі, наприклад, глобальний логгер, пул з'єднань або конфігурація програми.
Спрощення доступу
Коли потрібно надати зручну точку доступу до об'єкта з різних частин коду, без необхідності передавати його через всі рівні.
Заміна глобальних змінних
Сінглтон часто розглядається як "більш керований" варіант глобальних змінних, оскільки його можна тестувати і він інкапсулює логіку.
Як працює Сінглтон?
- Приватний конструктор
Запобігає створенню об'єктів через new, змушуючи всіх користувачів використовувати спеціальний метод доступу.
2. Статичний метод доступу
Зазвичай називається getInstance(). При першому виклику створює екземпляр і зберігає його, при наступних викликах повертає вже створений об'єкт.
3. Статична змінна
Зберігає посилання на єдиний екземпляр класу.
Приклад (TypeScript)
class Singleton {
private static instance: Singleton;
private constructor() {
// Приватний конструктор запобігає створенню об'єктів ззовні
console.log("Ініціалізація єдиного екземпляра...");
}
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
public someMethod(): void {
console.log("Виклик методу на сінглтоні!");
}
}
// Приклад використання
const obj1 = Singleton.getInstance(); // Ініціалізація та створення
const obj2 = Singleton.getInstance(); // Повертає вже створений екземпляр
console.log(obj1 === obj2); // true — обидва посилаються на один і той же об'єкт
obj1.someMethod(); // "Виклик методу на сінглтоні!"- instance — статична властивість, що зберігає посилання на єдиний об'єкт.
- конструктор закритий для зовнішніх викликів.
- При виклику методу
getInstance()перевіряє, чи об'єкт вже існує. Якщо ні — створює, якщо так — повертає існуючий.
Переваги
- Єдина точка доступу: Зручно управляти об'єктом, який повинен існувати в одному екземплярі.
- Легше тестувати, ніж глобальні змінні: Можна "замінити" Сінглтон у тестах, хоча це все ще не так просто, як з регулярними залежностями.
- Без дублювання: Гарантовано, що об'єкт не буде створено знову.
Недоліки
- Глобальний стан: Сінглтон ефективно замінює глобальні змінні, що при надмірному використанні може ускладнити тестування та логіку програми.
- Складніше рефакторити: Якщо тести або нові функції раптово потребують більше екземплярів, рефакторинг з Сінглтона може бути проблематичним.
- Непрямі залежності: Код, що використовує Сінглтон, часто не вказує явно залежності в інтерфейсі, а просто викликає getInstance(), що може приховувати логіку роботи.
Увага:
Надмірне використання сінглтонів може призвести до сильного зв'язування коду та ускладнити тестування. Перед впровадженням Сінглтона подумайте про патерни, такі як IoC (Inversion of Control) або DI (Dependency Injection).
Коли використовувати
- Унікальні ресурси: Логгер, системна конфігурація, клас для роботи з глобальним кешем.
- Синхронізація: Коли об'єкт повинен "управляти" ресурсом, доступним з різних потоків (якщо говорити про бекенд), і потрібно гарантувати "єдине" сховище.
Джерело
Читати більше про Сінглтон тут.
- refactoring.guru - патерни та рефакторинг
- patterns.dev - патерни
Зміст
Коли застосовувати "Сінглтон"? Як працює Сінглтон? Приклад (TypeScript) Переваги Недоліки Коли використовувати Джерело
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.