
Одиночка на TypeScript
Одиночка — это порождающий паттерн, который гарантирует существование только одного объекта определённого класса, а также позволяет достучаться до этого объекта из любого места программы.
Одиночка имеет такие же преимущества и недостатки, что и глобальные переменные. Его невероятно удобно использовать, но он нарушает модульность вашего кода.
Вы не сможете просто взять и использовать класс, зависящий от одиночки в другой программе. Для этого придётся эмулировать присутствие одиночки и там. Чаще всего эта проблема проявляется при написании юнит-тестов.
Сложность:
Популярность:
Применимость: Многие программисты считают Одиночку антипаттерном, поэтому его всё реже и реже можно встретить в TypeScript-коде.
Признаки применения паттерна: Одиночку можно определить по статическому создающему методу, который возвращает один и тот же объект.
Концептуальный пример
Этот пример показывает структуру паттерна Одиночка, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.
index.ts: Пример структуры паттерна
/**
* Класс Одиночка определяет геттер `instance`, который позволяет клиентам
* получить доступ к уникальному экземпляру одиночки.
*/
class Singleton {
static #instance: Singleton;
/**
* Конструктор Одиночки всегда должен быть скрытым, чтобы предотвратить
* создание объекта через оператор new.
*/
private constructor() { }
/**
* Статический геттер, управляющий доступом к экземпляру одиночки.
*
* Эта реализация позволяет вам расширять класс Одиночки, сохраняя повсюду
* только один экземпляр каждого подкласса.
*/
public static get instance(): Singleton {
if (!Singleton.#instance) {
Singleton.#instance = new Singleton();
}
return Singleton.#instance;
}
/**
* Наконец, любой одиночка может содержать некоторую бизнес-логику, которая
* может быть выполнена на его экземпляре.
*/
public someBusinessLogic() {
// ...
}
}
/**
* Клиентский код.
*/
function clientCode() {
const s1 = Singleton.instance;
const s2 = Singleton.instance;
if (s1 === s2) {
console.log(
'Singleton works, both variables contain the same instance.'
);
} else {
console.log('Singleton failed, variables contain different instances.');
}
}
clientCode();
Output.txt: Результат выполнения
Singleton works, both variables contain the same instance.