HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Одиночка

Суть паттерна

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

❗️Важно

Одиночка имеет такие же преимущества и недостатки, что и глобальные переменные. Его невероятно удобно использовать, но он нарушает модульность вашего кода.

singleton

Одиночка решает сразу две проблемы, нарушая принцип единственной ответственности класса.

  1. Гарантирует наличие единственного экземпляра класса. Чаще всего это полезно для доступа к какому-то общему ресурсу, например, базе данных.

Представьте, что вы создали объект, а через некоторое время пробуете создать ещё один. В этом случае хотелось бы получить старый объект, вместо создания нового.

Такое поведение невозможно реализовать с помощью обычного конструктора, так как конструктор класса всегда возвращает новый объект.

  1. Предоставляет глобальную точку доступа. Это не просто глобальная переменная, через которую можно достучаться к определённому объекту. Глобальные переменные не защищены от записи, поэтому любой код может подменять их значения без вашего ведома.
1/**
2*
3* В этом примере роль Одиночки отыгрывает класс подключения к базе данных.
4
5Этот класс не имеет публичного конструктора, поэтому единственный способ получить его объект — это вызвать метод getInstance. Этот метод сохранит первый созданный объект и будет возвращать его при всех последующих вызовах.
6*
7*
8*/
9
10class Database {
11 static instance = null;
12
13 static getInstance() {
14 if (!Database.instance) {
15 Database.instance = new Database();
16 }
17 return Database.instance;
18 }
19
20 constructor() { /* Database connection */ }
21
22 query(sql) { /* Execute query */ }
23}
24
25
26const d1 = Database.getInstance();
27const d2 = Database.getInstance();
28
29console.log(d1 === d1)

Все реализации одиночки сводятся к тому, чтобы скрыть конструктор по умолчанию и создать публичный статический метод, который и будет контролировать жизненный цикл объекта-одиночки.

Если у вас есть доступ к классу одиночки, значит, будет доступ и к этому статическому методу. Из какой точки кода вы бы его ни вызвали, он всегда будет отдавать один и тот же объект.

Когда использовать ?

  • Когда в программе должен быть единственный экземпляр какого-то класса, доступный всем клиентам (например, общий доступ к базе данных из разных частей программы).
  • Одиночка скрывает от клиентов все способы создания нового объекта, кроме специального метода. Этот метод либо создаёт объект, либо отдаёт существующий объект, если он уже был создан.
  • Когда вам хочется иметь больше контроля над глобальными переменными.
  • В отличие от глобальных переменных, Одиночка гарантирует, что никакой другой код не заменит созданный экземпляр класса, поэтому вы всегда уверены в наличии лишь одного объекта-одиночки.

Преимущества

  • Гарантирует наличие единственного экземпляра класса.
  • Предоставляет к нему глобальную точку доступа.
  • Реализует отложенную инициализацию объекта-одиночки.

Недостатки

  • Нарушает принцип единственной ответственности класса.
  • Маскирует плохой дизайн.
  • Требует постоянного создания Mock-объектов при юнит-тестировании.

Более подробнее почитать о паттерне одиночка можно тут

Hello