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.