DS
Back to TypeScript

singleton.ts

typescript/patterns/singleton.ts
TypeScript

Generic Singleton pattern implementation with lazy initialization.

singleton.ts
/**
 * @description Generic Singleton pattern implementation with lazy initialization.
 * @tags pattern, design-pattern, singleton, oop
 */
export abstract class Singleton<T> {
  private static instances = new Map<string, unknown>();

  protected constructor() {}

  static getInstance<T extends Singleton<T>>(
    this: new () => T
  ): T {
    const key = this.name;
    if (!Singleton.instances.has(key)) {
      Singleton.instances.set(key, new this());
    }
    return Singleton.instances.get(key) as T;
  }

  static resetInstance<T extends Singleton<T>>(
    this: new () => T
  ): void {
    Singleton.instances.delete(this.name);
  }
}