Singleton en Javascript

Toda persona que programa se ha topado alguna vez con los patrones de diseño, algo que yo creo que, cuando los aprendes (en mi caso en la Universidad se ven algunos y los aplicamos en Java) son un truño algo aburrido ya que todo sacado de contexto lo es.

Una vez que empiezas a meter el morro en el mundo de la programación y no eres no solamente el único que programa (es típico que haya grupos de 2 o 3 como máximo en España a la hora de hacer la mayoría de las prácticas) sino que la aplicación la usa mucha, mucha gente a la vez, te das cuenta de que los patrones de diseño no solamente son necesarios y útiles, sino que además… molan.

Aquí quiero ir poniendo algún que otro patroncillo y la intención es implementarlos en Javascript 🙂

Uno de los patrones más sencillos y que nos sirve para empezar, es el “Singleton”. Este patrón nos sirve para tener una única instancia de una clase, de manera que cualquiera que acceda a esa clase, trabaje sobre la misma instancia.

Esto, para una clase “Usuario” no vale para nada, ya que cuando creo un usuario y lo manipulo, quiero que sea nuevo y único… pero por ejemplo para manejar un objeto de conexión a una base de datos, sí que nos interesa que se acceda a uno solo, de manera que no tengamos 40.000 conexiones abiertas con la BBDD sino solamente una.

Para eso, nos tenemos que asegurar que nadie puede instanciar objetos de la clase ( La instancia se devuelve típicamente con un “getInstance()” )

var ClaseSingleton = (function () {

  // instancia que usaran los demas
  var instance;

  function init() {

    // Singleton

    // metodos que no podran ser accedidos por
    // nadie que use la instancia

    function _metodoPrivado(){
        console.log( "No me ves" );
    }

    var _variableProvada = "Soy inalcanzable para ti";

    var _numAleatorio = Math.random();

	//Esto es lo que devuelve la funcion init(), privada dentro de
	//la clase singleton. Lo que devuelve son, en definitiva
	//las funciones que hacemos publicas

    return {

      // Cosas publicas
      metodoPublico: function () {
        console.log( "Mirameee!" );
      },

      propiedadPublica: "Soy de todos ;)",

      getNumAleatorio: function() {
        return _numAleatorio;
      }

    };

  }; //fin init()

	//esto es a lo que obtendra acceso cualquiera que instancie el singleton
	//solo le damos opcion de hacer el getInstance()
  return {

    // Nos da la instancia si existe
    // o crea una nueva si no existe
    getInstance: function () {

      if ( !instance ) {
	    //el objeto tendra los metodos y props que devuelve init en el return!!
        instance = init();
      }

      return instance;
    }

  };

})();

¿Qué está pasando?

La “clase estática” ( Para simular la clase estática, hacemos una función que se ejecuta en cuanto se define, de manera que no es un objeto instanciable en javascript mediante un “new”, como sería una “clase” normal. ) “ClaseSingleton” tiene, digamos, dos partes: parte privada y la parte pública.

Para hacer una parte privada, es decir, inalcanzable desde fuera de la clase, escribirmos código dentro de la función que simula la clase con normalidad, esto es, creamos variables, funciones… lo que sea necesario, pero para que podamos controlar lo que se hace público y cómo, usaremos la sentencia “return”, devolviendo un objeto javascript que contendrá lo que queramos hacer público.

Es decir, ClaseSingleton puede tener 187 funciones pero si en el return solamente devolvemos una función, esa será la única pública.

Es decir, lo público irá en el objeto del return.

Lo que se hace aquí es dar solamente acceso a aquellos que usan nuestra clase a una función llamada getInstance que devuelve la instancia o la crea en caso de no existir. Cuando la crea, lo hace a través de la función “init” (el nombre es arbitrario, podrias llamarlo de otra manera…). Al llamar a la función init() lo que hace es obtener lo que esta funcion le devuelve en su return, que es un objeto javascript que contiene funciones y variables, que son en realidad, las acciones que ofrece nuestra clase.

 

Más información y MUY buena sobre patrones de diseño en javascript aquí.

 

Anuncios

4 pensamientos en “Singleton en Javascript

  1. Sunjo 08/07/2013 en 22:32 Reply

    Hola,

    Enhorabuena por el blog.

    Me surge una duda…funcionaría utilizando prototype para los métodos o es otra cosa??

    Lo dicho, enhorabuena

    • miguelbucarest 09/07/2013 en 08:37 Reply

      Hola!

      Gracias por leer y comentar 🙂

      Claro que se puede usar el prototype, todo se puede 😉 es solamente que hay cosas que a mí ni me vienen usando el prototipo…aunque tampoco soy un gurú, estoy muy lejos de serlo 🙂
      De todas formas, el patrón lo tomé de un libro de Ady Osmani y él lo hace así y en otros patrones usa el prototype, por lo que tal vez en el caso del singleton no tenga mucho sentido o ventajas… no sé 🙂

      Aquí te dejo un link de todas maneras sobre lo que me preguntas

      http://stackoverflow.com/questions/15625457/javascript-modular-prototype-pattern

      Saludos y gracias de nuevo!

  2. Oscar Bravo 08/08/2013 en 00:06 Reply

    Excelente aporte muchas gracias.. felicidades por su trabajo me parece muy bueno..ya habia leido un poco sobre este tema aki esta el link por si alguien mas le interesa leer un poco mas sobre el tema..
    http://quechuletas.blogspot.mx/2013/07/patrones-en-javascript-prototype-pattern.html

  3. miguelbucarest 08/08/2013 en 08:52 Reply

    Hola Oscar,

    gracias por el comentario 🙂 ojalá tuviera tiempo de poner más ejemplos, de todas maneras, si te interesa el tema, echa un ojo al link sobre ello en el blogroll, porque es muy, muy interesante 😀

    un abrazo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: