en Javascript

Patrones de Diseño en Javascript: El patrón Singleton

 -

El patrón singleton es uno de los patrones de diseño más populares.

La idea general de este patrón es la de asegurar que una clase genera una única instancia, es decir, limitar la instanciación de una clase a un único objeto.

En lenguajes basados en clases como Java, cualquier objeto que creemos tiene que ser instanciado por una clase. Asi que  este patrón tiene más sentido en este tipo de lenguajes si queremos asegurar que una clase instancia un sólo objeto, y generar una asociación uno-a-uno entre la clase y su intancia.

        class Singleton {
                private static Singleton instance = null;
                private Singleton() { }
                public static Singleton getInstance() {
                        if (instance == null) {
                                instance = new Singleton();
                        }
                        return instance;
                }
        }

En Javascript, sin embargo, podemos crear un objeto directamente. Por lo que un singleton en su forma mas simple podria ser esto:

        
        var mySingleton = {
          property1: "something",

          property2: "something else",

          method1:function(){
            console.log('hello world');
          }

        };

Asi que los singletons los podemos utilizar en Javascript sencillamente como namespaces que aislan el código del namespace global y ofrecen un único punto de acceso para las funciones.

Podriamos llevar este código más allá y añadir miembros y metodos privados. Una vez hecho esto, podemos exponer sólo aquello que queramos hacer publico:

        
       var mySingleton = function(){

          // here are our private methods and variables
          var privateVariable = 'something private';
          function showPrivate(){
            console.log( privateVariable );
          }

          // public variables and methods (which can access
          // private variables and methods )
          return {

            publicMethod:function(){
              showPrivate();
            },

            publicVar:'the public can see this!'

          };
        };

        var single = mySingleton();
        single.publicMethod();  // logs 'something private'
        console.log( single.publicVar ); // logs 'the public can see this!'

Si queremos acercarnos más al concepto clásico de singleton con Javascript, podemos montar una clase para que instancie el objeto sólo una vez. Para ello necesitamos hacer el constructor privado y proveer de un metodo publico que devuelva la instancia (y que controle que sólo se crea una):

        
         var Singleton = (function() {
                var instance = null;

                function PrivateConstructor() {
                    var rand = Math.round(Math.random() * 100);
                    this.getRand = function() {
                        return rand;
                    } 
                }

                return new function() {
                    this.getInstance = function() {
                        if (instance == null) {
                            instance = new PrivateConstructor();
                            instance.constructor = null;
                        }
                        return instance;
                    }
                }
        })();

        var singletonInstance = Singleton.getInstance();

¿Qué opinas de los patrones de diseño? ¿Los aplicas en tu trabajo diario? ¿Qué patron de diseño es el que más utilizas? ¿Qué opinas del patrón Singleton?

Esperamos vuestros comentarios.

 Enlaces y más

Post Anterior
Post Siguiente

Política de Comentarios de pixelovers

Responsable » Juan Manuel Garrido
Finalidad » Moderación de los comentarios
Legitimación » Tu consentimiento expreso que te será requerido por Disqus.
Destinatarios » Los datos de tus comentarios los guardará Disqus, mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy Shield tal y como recoge su politica de privacidad
Derechos » Desde Disqus, por tanto, podrás acceder, rectificar, limitar y suprimir tus comentarios o tu cuenta
Tienes más detalles acerca del tratamiento de los datos relacionados con los comentarios en nuestra (Política de Privacidad)

  1. Me cae muy bien el Singleton, y en general, toda la programación orientada a objetos; Python, por ejemplo.

    Empecé a conocer este mundillo con el viejo Actionscript, las clases y objetos y extraño poder manejar un site entero, en html, con un único control centralizado de todos los eventos 🙁