imagen

Singleton con TS

En ingeniería de software, singleton o instancia única es un patrón de diseño que permite restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto. (wiki)

Un caso de uso recurrente es cuando creamos o implementamos un servicio que es instanciado multiples veces en la aplicación y si su nivel de abstracción lo permite, este quizás pueda ser reutilizado y no sea necesario crear una instancia cada vez que lo necesitemos.

Con TypeScript esto es sencillo de lograr mediante la utilización de constructores privados

export class MyService {
  // Definimos el servicio como propiedad estatica para acceder a el
  static instance: MyService | null = null;

  // Definimos el constructor privado que sólo puede ser utilizado en esta clase
  private constructor(private name: string) {}

  // Método público
  getName() {
    return this.name;
  }

  // Método estatico para crear una nueva instancia del servicio
  static create(name: string) {
    // Sólo si el servicio no ha sido instanciado, lo creamos
    if (MyService.instance === null) {
      console.log('debería entrar una vez');
      MyService.instance = new MyService(name);
    }
    // Retornamos el servicio
    return MyService.instance;
  }
}

const myService1 = MyService.create('service 1');
console.log(myService1.getName());
const myService2 = MyService.create('service 2');
console.log(myService2.getName());
const myService3 = MyService.create('service 3');
console.log(myService3.getName());

console.log(myService1 === myService2);

De esta forma independiente de la cantidad de veces que hagamos un MyService.create( siempre vamos a estar utilizando la misma instancia y reducir el uso de memoria.