No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

隆Se acaba el precio especial! Aprende Ingl茅s, AI, programaci贸n y m谩s.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

1 D铆as
11 Hrs
26 Min
22 Seg

Implementaci贸n de Singleton en JS

4/27
Recursos

Aportes 11

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

 class Singleton {
    static instance = undefined; //Atributo est谩tico para almacenar el valor, llamado para la validaci贸n de getInstance() 

    constructor(version) {
        this.version = version;
    }

    static getInstance(version) {
        //Si no existe el atributo instance...
        if (!Singleton.instance) {
            Singleton.instance = new Singleton(version); //...lo crea. 
        }
        return Singleton.instance;
    }

}

function appSingleton() {
    //Todas las variables tienen la misma referencia al mismo objeto. 1 sola instancia a lo largo de la aplicaci贸n:
    const singleton1 = Singleton.getInstance('version-1')
    const singleton2 = Singleton.getInstance('version-2')
    const singleton3 = Singleton.getInstance('version-3')

    console.log(singleton1 === singleton2); //true
    console.log(singleton1 === singleton3); //true
}
appSingleton();

T茅cnica para evitar el uso de new Singleton:

class Singleton {
	constructor() {
		throw new Error('No constructor in this house!')
	}
}

Pseudoc贸digo:


.

Diagrama:

Para los que les gusta TS como a mi, aqui el code adaptado:

class Singleton {
    static instance : Singleton | undefined;
    version:string

    constructor(version: string){
        this.version = version;
    }

    static getInstance(version:string){
        if(!Singleton.instance){
            Singleton.instance = new Singleton(version);
        }

        return Singleton.instance;
    }
}

function appSingleton() {
    //Todas las variables tienen la misma referencia al mismo objeto. 1 sola instancia a lo largo de la aplicaci贸n:
    const singleton1 = Singleton.getInstance('version-1')
    const singleton2 = Singleton.getInstance('version-2')
    const singleton3 = Singleton.getInstance('version-3')

    console.log(singleton1)
    console.log(singleton2)
    console.log(singleton3)

    console.log(singleton1 === singleton2); //true
    console.log(singleton1 === singleton3); //true
}
appSingleton();

Algo interesante es que al leer el valor de version de las todas las instancias, el valor siempre ser谩 el de la primera instancia que se ha creado. En este caso 鈥渧ersion-1鈥.

function appSingleton() {
  const singleton1 = Singleton.getInstance("version-1");
  const singleton2 = Singleton.getInstance("version-2");
  const singleton3 = Singleton.getInstance("version-3");

  console.log(singleton1 === singleton2);
  console.log(singleton1 === singleton3);
  console.log(singleton3.version); // version-1
}
Este patr贸n de dise帽o lo estuve utilizando sin saber que as铆 se llamaba, cre茅 una instancia para usar `remote-config` en un proyecto y funciona muy bien, no he visto a ninguno de mis colaboradores si quiera intentar usar el `new()` Me alegra poder conocer la teor铆a detr谩s de ello y poder argumentar su uso.
As铆 fue como lo hab铆a aprendido a hacerlo ```js class Singleton{ static instance = undefined constructor(version){ if(Singleton.instance){ return Singleton.instance } this.version = version Singleton.instance = this } } ```class Singleton{聽 聽 static instance = undefined聽 聽 constructor(*version*){聽 聽 聽 聽 if(Singleton.instance){聽 聽 聽 聽 聽 聽return Singleton.instance 聽 聽 聽 聽 }聽 聽 聽 聽 this.version = *version*聽 聽 聽 聽 Singleton.instance = this聽 聽 }}con

Les dejo el Singleton en Java

Diagrama del patr贸n Singleton.

  1. Hacer que el constructor sea privado.
  2. Crear un m茅todo est谩tico que llame al constructor privado, internamente, y que guarde la instancia en una variable est谩tica.
Creo que por cuestiones didacticas seria mas conveniente empezar con los ejemplos y a partir de ahi ir identificando cada concepto, debido a que es mas dificil comprender los conceptos desde la abstraccion. En el mundo real, para llegar a los patrones de diseno primero se dan los casos de uso y luego se identifican los patrones y crean los conceptos a partir de las ocurrencias repetidas. Creo que seria valiosa esta metodologia para los cursos de programacion en general.
馃煛 Se podr铆a usar adem谩s la variable instance como privada, para evitar su modificaci贸n? ```js class Singleton { static #instance = undefined constructor(version){ this.version = version } static getInstance(version) { if (!Singleton.#instance) { Singleton.#instance = new Singleton(version) } return Singleton.#instance } } function appSingleton() { const singleton1 = Singleton.getInstance('version1') const singleton2 = Singleton.getInstance('version2') console.log(singleton1 === singleton2) // true } appSingleton() ```*class* Singleton {聽 聽 *static* #instance = *undefined* 聽 聽 constructor(*version*){聽 聽 聽 聽 this.version = *version*聽 聽 } 聽 聽 *static* getInstance(*version*) {聽 聽 聽 聽 *if* (!Singleton.#instance) {聽 聽 聽 聽 聽 聽 Singleton.#instance = new Singleton(*version*)聽 聽 聽 聽 } 聽 聽 聽 聽 *return* Singleton.#instance聽 聽 }} function appSingleton() {聽 聽 const singleton1 = Singleton.getInstance('version1')聽 聽 const singleton2 = Singleton.getInstance('version2')聽 聽 聽 聽 console.log(singleton1 === singleton2) *// true*} appSingleton()