La forma de resolver el patrón singleton en JS (en realidad, TS) se ve así (el mejor enfoque si me preguntas):
export default class Singleton { private static _instance: Selection constructor() { if (Selection._instance) { return Singleton._instance } else { Singleton._instance = this } } }Y entonces:
import Singleton from './Singleton.ts' const singleton_1 = new Singleton() const singleton_2 = new Singleton() singleton_1 === singleton_2 // truePero en este escenario tengo que crear nuevas variables cada vez que necesito esa clase.
Puedo lograr exactamente lo mismo de la manera más fácil:
class Singleton { constructor() { // some logic } } export default new Singleton() import Singleton from './Singleton.ts' const wut = Singleton.field Singleton.method('do something')¿Me estoy equivocando en algo o el primer enfoque es un poco excesivo y complicado y el segundo simplemente hace lo mismo de una manera más obvia?
Entiendo que si tengo campos estáticos en mi clase, no podría usarlos de esa manera, pero los casos en los que realmente necesita campos estáticos son raros.
Es esencial en un escenario donde solo se necesita crear una instancia, por ejemplo, una conexión de base de datos. Solo es posible crear una instancia cuando la conexión está cerrada o te aseguras de cerrar la instancia abierta antes de abrir una nueva. Este patrón también se conoce como patrón estricto, un inconveniente asociado con este patrón es su abrumadora experiencia en las pruebas debido a sus objetos de dependencias ocultas que no se seleccionan fácilmente para las pruebas.
let databaseInstance = null; // tracks the number of instances created at a certain time let count = 0; function init() { console.log(`Opening database #${count + 1}`); //now perform operation } function createIntance() { if(databaseInstance == null) { databaseInstance = init(); } return databaseInstance; } function closeIntance() { console.log('closing database'); databaseInstance = null; } return { open: createIntance, close: closeIntance } } const database = DatabseConnection(); database.open(); //Open database #1 database.open(); //Open database #1 database.open(); //Open database #1 database.close(); //close database