Comunidad de diseño web y desarrollo en internet online

Duda sobre Singleton

Citar            
MensajeEscrito el 09 Feb 2009 09:05 pm
Muy buenas, estaba investigando sobre el patrón de diseño Singleton y me surgió una duda existencial. Por ejemplo, hay aquí un tip de Tmeister titulado "Acceder el Stage desde cualquier clase en Actionscript 3", en el que usa una clase Singleton con el siguiente código:

Código ActionScript :

package net.tmeister.utils 
{ 
   public dynamic class Global 
   { 
      private static var global : Global 
 
      public static function getInstance() : Global 
      { 
         if ( global == null ) 
         { 
            global = new Global( arguments.callee ); 
         } 
         return global; 
      } 
 
      public function Global( caller : Function = null )  
      {    
         if ( caller != Global.getInstance ) 
         { 
            throw new Error ("Global is a singleton class, use getInstance() instead"); 
         } 
         if ( Global.global != null ) 
         { 
            throw new Error( "Only one Global instance should be instantiated" );    
         }    
      } 
   } 
} 


Con el siguiente método de uso:

Código ActionScript :

package  
{ 
   import flash.display.MovieClip; 
   import net.tmeister.utils.Global 
   public class Main extends MovieClip 
   { 
      private var global:Global; 
       
      public function Main() 
      { 
         global = Global.getInstance(); 
         global.stage = stage 
         trace('global.stage' + global.stage) 
         global.algunOtroValor = new MovieClip() 
         trace('global.algunOtroValor ' + global.algunOtroValor) 
      } 
   } 
} 


Y mi duda existencial es: ¿qué ventajas aporta tener una sola intancia frente a no tener ninguna? En este caso concreto:

Código ActionScript :

package net.juanlu.utils 
{ 
   public dynamic class Global 
   { 
      public function Global()  
      {
            throw new IllegalOperationError ("Norl. "); 
      } 
   } 
} 


Código ActionScript :

package  
{ 
   import flash.display.MovieClip; 
   import net.juanlu.utils.Global 

   public class Main extends MovieClip 
   {
      public function Main() 
      {
         Global.stage = stage
         trace('Global.stage' + Global.stage) 
         Global.algunOtroValor = new MovieClip() 
         trace('Global.algunOtroValor ' + Global.algunOtroValor)
      } 
   } 
} 

Por Juanlu_001

Claber

690 de clabLevel

6 tutoriales

 

chrome
Citar            
MensajeEscrito el 09 Feb 2009 09:39 pm
En mi opinión se opta por el enfoque de tener una instancia en lugar de no tener ninguna por varias razones. Por un lado, por definición un Singleton se utiliza para tener una y sólo una instancia de una clase, no "ninguna".

Otra razón que veo es que, si en un momento quieres que tu clase se pueda instanciar más veces (ya sea un número concreto de veces, o las veces que quiera), es más sencillo modificar la clase Singletoniana para hacerla normal, simplemente cambiar el constructor y borrar el getInstance. En una clase pura estática habría que cambiar todos los atributos y hacerlos no estaticos, etc.

También, si la clase es bastante jevi en cuanto a consumo de memoria, no te interesa que la clase sea pura estática (que es lo que tú defines como "ninguna instancia"), ya que incluso cuando no esté en uso seguirá ocupando la memoria, mientras que un Singleton puedes instanciarlo en cualquier momento y definir un destructor para que en un momento dado podamos borrar la instancia.

A ver si se me ocurren otras razones de más peso.

Por TheOm3ga

267 de clabLevel

1 tutorial

1 ejemplo

 

To your south!!!

firefox
Citar            
MensajeEscrito el 11 Feb 2009 07:41 pm
Jmmm... interesante, gracias por el aporte :)

A ver si alguien dice algo más

Por Juanlu_001

Claber

690 de clabLevel

6 tutoriales

 

chrome
Citar            
MensajeEscrito el 28 May 2009 08:17 am
Hola, yo tengo otra duda respecto a esto de implementar Singleton:
En teoría, ¿no debería ser privado el constructor de la clase Singleton, para asegurar que sólo creamos la instancia usando getInstance?

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.