Avisar de contenido inadecuado

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

 
{
}
{
}

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

Fantástica explicación! Así es muy facil de entender ¿Explicarás más patrones de diseño?

toni toni 25/03/2012 a las 21:11

@Toni, thanks!!!


Esa es la idea, a ver si poco a poco vamos explicando más patrones de diseño.


¿Alguna idea sobre cual deberia ser el proximo? ;-)

¡Bravo Juanma! Muy buena entrada :D


¿Para el próximo, que te parece el patrón Lazy? Es bastante potente y curioso a la vez.

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 :-(




Hormigón proyectado en Panamá

Hola.
Quería presentarte una web dedicada Construcción de piscinas en Panamá es muy interesante y tambien trabajan en españa con el nombre de acuaeuropa (Mosaiquillo)
Gracias por el post!
Jesus Jesus 15/05/2014 a las 12:36

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

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar de usuario Tu nombre