El patrón Singleton es un patrón de diseño que restringe la instancia de una clase a un único objeto. Es útil cuando necesitas exactamente una instancia de un objeto para coordinar acciones en todo el sistema.

Implementación Básica

El siguiente ejemplo muestra una implementación básica del patrón Singleton en JavaScript:

class Singleton {
  constructor() {
    if (Singleton.instance) {
      return Singleton.instance;
    }
    Singleton.instance = this;
  }
}

En este ejemplo, la intención es que cualquier instancia futura devuelta por el constructor sea la misma que la instancia original.

Acceder al Singleton

Para acceder a la única instancia del Singleton, simplemente se crea una nueva instancia utilizando el constructor:

const instance1 = new Singleton();
const instance2 = new Singleton();

console.log(instance1 === instance2); // true

La consola devolverá 'true' porque ambas variables hacen referencia a la misma instancia.

Añadiendo Métodos al Singleton

Podemos añadir métodos a nuestra clase Singleton:

class Singleton {
  constructor() {
    if (Singleton.instance) {
      return Singleton.instance;
    }
    this.value = 0;
    Singleton.instance = this;
  }

  getValue() {
    return this.value;
  }

  setValue(value) {
    this.value = value;
  }
}

const instance1 = new Singleton();
instance1.setValue(42);

const instance2 = new Singleton();
console.log(instance2.getValue()); // 42

En este ejemplo, los métodos 'getValue' y 'setValue' pueden modificar y acceder al valor de la propiedad 'value', demostrando que todas las instancias del Singleton comparten el mismo estado.

Usando Closures para un Singleton

Otra forma popular de implementar el patrón Singleton en JavaScript es usando closures:

const Singleton = (function () {
  let instance;

  function createInstance() {
    const object = new Object('I am the instance');
    return object;
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    }
  };
})();

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true

En este ejemplo, 'getInstance' devuelve siempre la misma instancia, asegurando que sólo una instancia de la clase puede existir.

El patrón Singleton es una poderosa herramienta en el desarrollo de software que puede asegurar que una clase tenga solo una instancia a la vez. Conocer y entender cómo implementarlo puede ser muy beneficioso, especialmente para gestionar aplicaciones grandes y complejas.