Patrón Singleton implícito en JavaScript


Uno de los tantos patrones arquitectónicos en ingeniería del software es el llamado Singleton. No voy a explicar el patrón singleton por completo, simplemente decír que como idea principal se define una clase de la que solo existirá una instancia.

Por lo tanto en una clase qu cumpla con el singleton se define el método getInstancia() que solo se ocupa de devolver la única instancia existente. Así que el constructor no se ejecuta siempre, solamente invoca cuando no existe ninguna instancia. Cuando si la hay se devuelve la referencia a ella. Así de sencillo.

Y esto se implementa así en cualquier lenguaje orientado a objetos. De hecho incluso en JavaScript se puede implementar una clase con estas caracteristicas, el unico problema es que en JavaScript no hay métodos privados y siempre podría hacer un new miClase() y me devolveria una instancia nueva.

Pues bien, hay una caracteristica en JavaScript que me hace pensar que esto se puede hacer sin ningun problema, solo por las caracteristicas del propio lenguaje, ya que una funcion es una funcion y una variable también puede serlo etc. y jugando con esto podemos definir una clase que compla el partrón implicitamente y otra que no.

Definir el objeto

Objeto que no cumple el patrón singleton:

function objetoNoSingleton(){
   this.cadena = "cadena de texto";
   this.metodo = function(){
      alert(cadena);
   }
}

Objeto que cumple el patrón singleton:

var objetoSingleton = {
   cadena : "cadena de texto",
   metodo : function() {
      alert(cadena);
   }
}

Este objeto singleton es una variable y un objeto, pero es un objeto de clase irreproducible, de hecho al ejecutar new objetoSingleton() la instrucción falla.

Añadiendo funcionalidades

Existen diferencias de sintaxis debido al lenguaje. De hecho si queremos utilizar la propiedad prototype (no la libreria) para añadir métodos o variables a los objetos también existen diferencias.
Objeto que no cumple el patrón singleton:

objetoNoSingleton.prototype.valor2 = "valor dos";
objetoNoSingleton.prototype.metodo2 = function(){
   alert(valor2);
}

Para ser ejecutado necesitamos una instancia ya que estamos añadiendo funcionalidades a una clase no a un objeto en particular:

var instanciaNoSingleton = new objetoNoSingleton();
instanciaNoSingleton.metodo2();

Objeto que cumple el patrón singleton no hay que usar prototype. Crear un nuevo elemento en el objeto es simplemente nombrarlo y asignarle valor porque ya es una instancia.

objetoSingleton.valor2 = "valor dos";
objetoSingleton.metodo2 = function(){
   alert(valor2);
}

objetoSingleton.metodo2();

Con un objeto único se elimina el método getInstancia() típico del patrón Singleton, pero en si también desaparece la función new, por lo que en realidad el objeto a usar va a ser siempre la misma instancia.

, , ,

  1. No hay Comentarios
(No será publicado)