No tienes acceso a esta clase

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

Singleton: constructor privado

14/25
Recursos

Aportes 17

Preguntas 5

Ordenar por:

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

se me hace extranio entender en que forma sera util (se nota que falta mucha experiecia).
pero se ve interesante!.

隆Qu茅 interesante! 馃槷

Singleton: constructor privado

Singleton nos previene crear m煤ltiples instancias de una clase.

Esto es muy usado en Arquitectura de Software, pues nos ayuda a ahorrar uso de memoria.

export class MyService {
  static instance: MyService | null = null;

  private constructor(
    private name: string
  ) {}

  get Name() {
    return this.name;
  }

  static create(name: string) {
    if (MyService.instance === null) {
      console.log('Creating new instance');
      MyService.instance = new MyService(name);
    }
    return MyService.instance;
  }
}

const myService1 = MyService.create('MyService1');
console.log(myService1.Name)

const myService2 = MyService.create('MyService2');
console.log(myService2.Name)

const myService3 = MyService.create('MyService3');
console.log(myService3.Name)

console.log(myService1 === myService2); //* true
console.log(myService1 === myService3); //* true

la propiedad instace no deber铆a se private para que no se pueda acceder a ella directamente desde fuera?

馃捇 Para aquellos que quieran ir un poco m谩s all谩 y entender mejor que es, como funciona, porque usar o no usar este patron de dise帽o, les dejo este enlace a un video de BettaTech donde lo explica a mayor detalle.
.
馃帴 Ac谩 una lista de reproducci贸n con m谩s patrones de dise帽o
.
Espero este aporte les sea de ayuda 馃槃

no es posible hacer este patron sin typescript?

Prop贸sito

Singleton es un patr贸n de dise帽o creacional que nos permite asegurarnos de que una clase tenga una 煤nica instancia, a la vez que proporciona un punto de acceso global a dicha instancia.

https://refactoring.guru/es/design-patterns/singleton

Si quieres aprender un poco m谩s sobre patrones de dise帽o te dejo este recurso que me pareci贸 genial:

https://refactoring.guru/es/design-patterns

Esta clase estuvo muy buena, el patr贸n singleton nos sirve para crear una 煤nica instancia de alg煤n objeto en espec铆fico鈥 por ejemplo podemos gestionar conexiones a bases de datos.

Veo la utilidad cuando se trabaja con bases de datos, por ejem tienes varios modulos (archivos .ts) en los que necesitas interactuar con una base de datos, si te conectas a la misma base de datos desde cada modulo, va a haber un delay y puede producir bugs, con singleton, si te contectas a la base de datos una vez, siempre vas a usar la misma conexi贸n no importa si llamas la funcion 鈥渃onnect鈥 mas de una vez en diferentes modulos.

En TypeScript, el patr贸n Singleton se utiliza para asegurarse de que solo exista una instancia de una clase en todo el programa. Esto es 煤til cuando necesitas tener acceso a un objeto 煤nico desde m煤ltiples partes del c贸digo.
.
Aqu铆 tienes un ejemplo de c贸mo implementar un Singleton en TypeScript con un constructor privado:

class Singleton {
  private static instance: Singleton;  // La instancia 煤nica de la clase

  private constructor() {
    // El constructor privado evita la creaci贸n de instancias directamente
  }

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

    return Singleton.instance;
  }

  public showMessage(): void {
    console.log("Soy una instancia de Singleton");
  }
}

// Uso del Singleton
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2);  // true, ambas variables apuntan a la misma instancia

instance1.showMessage();  // "Soy una instancia de Singleton"
instance2.showMessage();  // "Soy una instancia de Singleton"

En este ejemplo, la clase Singleton tiene un constructor privado, lo que significa que no se puede crear una instancia directamente usando new Singleton(). En cambio, debemos utilizar el m茅todo est谩tico getInstance() para obtener la instancia existente o crear una nueva si a煤n no existe.
.
Cuando llamamos a getInstance(), verificamos si la instancia ya existe. Si no existe, creamos una nueva instancia y la asignamos a la propiedad est谩tica instance. Luego, devolvemos la instancia existente o reci茅n creada.
.
Al utilizar el Singleton, podemos crear m煤ltiples referencias a trav茅s de getInstance(), pero todas apuntar谩n a la misma instancia. Por eso, al comparar instance1 y instance2, obtenemos true. Adem谩s, ambas instancias pueden llamar al m茅todo showMessage() y mostrar谩n el mismo mensaje en la consola.
.
Espero que este ejemplo te haya ayudado a entender c贸mo se implementa un Singleton en TypeScript con un constructor privado. Si tienes alguna otra pregunta, no dudes en hacerla.

Esto es super 煤til, muy circunstancial pero super 煤til.

No se ustedes, pero yo me estaba volviendo loco pensando en 驴Por qu茅 ha utilizado MyService para acceder al atributo "instance" y no this siendo que est谩 accediendo dentro de la propia clase? Bueno, al parecer, this solo hace referencia a los atributos y m茅todos de la clase en la instancia actual. Esto no aplica a los atributos o m茅todos static, ya que no son a nivel de instancia, sino que son parte de la propia clase. Por lo que para acceder a cualquier elemento static necesitamos hacer referencia a la clase: `MyService.instance` Espero haberme explicado bien 馃槃
Me gustar铆a ver un ejemplo mas practico de este tema

Casos de uso para Singleton:

  • Acceso a recursos compartidos: Cuando hay recursos compartidos, como bases de datos, archivos de registro o conexiones de red, se puede utilizar el patr贸n Singleton para garantizar que solo exista una instancia de la clase que maneja esos recursos. Esto evita conflictos de acceso y garantiza que todos los componentes del sistema interact煤en con la misma instancia.
  • Configuraci贸n global: Si se necesita una configuraci贸n global accesible desde diferentes partes del sistema, el patr贸n Singleton puede utilizarse para mantener y acceder a esa configuraci贸n de manera centralizada. Por ejemplo, una clase Singleton de configuraci贸n podr铆a almacenar valores como el idioma, la apariencia o las preferencias del usuario.
  • Registro centralizado: En algunos casos, puede ser 煤til tener un registro centralizado de objetos o servicios disponibles en el sistema. El patr贸n Singleton puede utilizarse para implementar este registro y proporcionar acceso a los objetos registrados desde cualquier parte del sistema. Por ejemplo, un registro de servicios puede almacenar instancias 煤nicas de clases que proporcionan funcionalidades espec铆ficas y permitir que otros componentes del sistema las utilicen mediante una interfaz com煤n.

Ya veo por que la gente dice que los patrones de dise帽o diferencian a un junior de un senior

Sabia que los patrones de dise帽o eran muy importantes ya que definen la mejor forma de crear instancias y optimizar c贸digo limpio. Aunque principalmente por mi inexperiencia usando programaci贸n orientada a objetos soy incapaz de darle un uso por ahora. Pero se que en alg煤n punto lo ocupare.