Демистификация шаблона проектирования Singleton в TypeScript

В этой статье мы рассмотрим шаблон проектирования Singleton и его реализацию в TypeScript. Шаблон Singleton — это творческий шаблон проектирования, который ограничивает создание экземпляра класса одним объектом, гарантируя, что во всем приложении существует только один экземпляр класса. Мы обсудим концепцию шаблона Singleton и предоставим примеры кода для различных способов его реализации в TypeScript.

Понимание шаблона проектирования Singleton.
Шаблон Singleton обычно используется, когда нам необходимо ограничить количество экземпляров класса по различным причинам, например, для совместного использования ресурсов, управления глобальным состоянием или контроля доступа к ресурсу. Он обеспечивает глобальную точку доступа к созданному объекту, позволяя получить к нему доступ из любой точки приложения.

Метод 1: нетерпеливая инициализация
При нетерпеливой инициализации создается экземпляр класса Singleton во время загрузки класса. Это гарантирует, что экземпляр всегда доступен и готов к доступу.

class Singleton {
    private static instance: Singleton = new Singleton();
    private constructor() { }
    public static getInstance(): Singleton {
        return this.instance;
    }
}

Метод 2: ленивая инициализация (простой)
При ленивой инициализации экземпляр класса Singleton создается только при первом запросе. Это может помочь оптимизировать использование памяти и повысить производительность.

class Singleton {
    private static instance: Singleton | null = null;
    private constructor() { }
    public static getInstance(): Singleton {
        if (!this.instance) {
            this.instance = new Singleton();
        }
        return this.instance;
    }
}

Метод 3: ленивая инициализация (потокобезопасная)
Подход ленивой инициализации может быть дополнительно улучшен для обеспечения потокобезопасности в многопоточной среде с использованием методов синхронизации.

class Singleton {
    private static instance: Singleton | null = null;
    private constructor() { }
    public static getInstance(): Singleton {
        if (!this.instance) {
            // Synchronize access for thread safety
            synchronized (Singleton.class) {
                if (!this.instance) {
                    this.instance = new Singleton();
                }
            }
        }
        return this.instance;
    }
}

Метод 4: Singleton с внедрением зависимостей (DI)
В TypeScript мы также можем реализовать шаблон Singleton, используя платформы внедрения зависимостей. Вот пример использования популярной библиотеки InversifyJS.

import { injectable } from 'inversify';
@injectable()
class Singleton {
    // Class implementation
}
// Usage
const instance = container.get(Singleton);

В этой статье мы рассмотрели различные методы реализации шаблона проектирования Singleton в TypeScript. Мы обсудили быструю инициализацию, ленивую инициализацию (простую и потокобезопасную) и использование фреймворков внедрения зависимостей. Понимание шаблона Singleton и вариантов его реализации поможет вам принимать обоснованные решения при создании одноэкземплярных классов в проектах TypeScript.