Diseño Singleton Patterns en .Net

 

Fecha: 12/Ago/2005 (10/08/2005)
Autor: Rommel Meza (rommelmeza@gmail.com)

 


Antes de empezar una breve descripción de Singleton Patterns.

Singleton Patterns es una técnica de diseño para forzar a una clase a tener una única instancia o un control de instancias de ella dentro de todo el contexto de la aplicación. Esto se debe a que una clase singleton tiene sus constructores privados o protegidos, al referirme a sus constructores es por que no es obligatorio tener un único constructor talvez la forma de trabajar del singleton se defina en tiempo de ejecución:

Singleton Patterns de única instancia dentro de la clase:

----Ejemplo1
// Clase Singleton
public class Singleton
{
   // Unica Instancia de la clase
   private static Singleton _singleton = null;

   // Unico Constructor de la clase 
   // (Privado - solo es accesible dentro de esta clase)
   private Singleton()
   {
   }

   // Obtiene la instancia unica de la clase
   public static Singleton getInstance()
   {
     if (_singleton==null) //Verificamos si no ha sido creado
     {
       _singleton = new Singleton();
     }
     return _singleton; //Regresamos la instancia unica del objeto
   }
}

// Clase de prueba
public class Prueba
{
   private static void main(string[] args)
   {
     //Singleton s0 = new Singlton();  ----Error
     Singleton s1 = Singleton.getInstance();
     Singleton s2 = Singleton.getInstance();
     if(s1==s2)
     {
       // Misma instancia
     }
   }
}

 

Para su funcionamiento tenemos que tener una variable estática en el ejemplo anterior es _singleton que almacenara nuestra única instancia de la clase, un método estático por el cual podamos obtener la instancia getInstance () que nos regresa una instancia de Singleton y al tener el constructor privado no es posible crear una instancia de la clase fuera de la clase esto no lleva a que el único punto de acceso a la clase es la función getInstance ().

La función para obtener la instancia podemos ver que primero valida si la instancia ya ha sido creada y si no la crea recuerden que dentro de la misma clase si podemos usar su constructor auque sea privado, una vez creada la clase regresamos la instancia de la clase y para futuras llamadas al validar si la instancia es nula yo no será nula y únicamente regresara la referencia de la misma.

En el ejemplo anterior podemos ver la forma de funcionar, la única forma de obtener una instancia de la clase Singleton es por medio del método getInstance () y la instancia que nos retornara siempre será la misma esto nos da un gran ventaja ya que puedo mandar llamar la clase singleton desde distintas clases o funciones y siempre estaré trabajando sobre el mismo objeto.

Ejemplo de la utilización de Singleton:

-----Ejemplo2
// Clase Singleton Unica Instancia
public class Singleton
{
   // Unica Instancia de la clase
   private static Singleton _singleton = null;
   
   // Variable que almacenar cuantas veces ha sido llamada la funcion Count
   private int _count = 0;

   // Unico Constructor de la clase 
   // (Privado - solo es accesible dentro de esta clase)
   private Singleton()
   {
   }

   // Obtiene la instancia unica de la clase
   public static Singleton getInstance()
   {
     if (_singleton==null) //Verificamos si no ha sido creado
     {
       _singleton = new Singleton();
     }
     return _singleton; //Regresamos la instancia unica del objeto
   }

   //Funcion que nos regresa las veces que ha sido utilizado
   public int Count()
   {
     _count++;
     return _count;
   }
}

// Clase de prueba
public class Prueba
{
   private static void main(string[] args)
   {
     Singleton s1 = Singleton.getInstance();
     System.Console.Out.WriteLine("Count: " + s1.Count().ToString());
     Singleton s2 = Singleton.getInstance();
     System.Console.Out.WriteLine("Count: " + s2.Count().ToString());
   }
}

En este ejemplo vemos una pequeña utilización de Singleton pero esto puede ser algo confuso para algunos, el hecho de que existan métodos estáticos y métodos no estáticos puede confundir. Esto es sencillo de explicar:
Los métodos y variables estáticas (static) que estén dentro de la clase pertenecen a la clase y no a la instancia misma esto se ve reflejado ya que puedo usarlas sin utilizar el operador del new que es el encargado de crear el objeto en memoria, esto quiere decir que solo existe una variable estática sin importar cual sea el numero de instancias de la clase.
Los métodos y variables no estáticos son aquellos que pertenecen a la instancia esto es se creen tantos métodos y atributos no estáticos como instancias de la clase existan, son propios de la instancia y no de la clase.
Analice la siguiente imagen para ver eso:


En esta imagen se aprecia la diferencia por ejemplo para hacer referencia a la variable Y nesecito una instancia y luego aplicar [nombre de la instancia].Y eso es por que Y pertenece a la instancia pero por el contrario X pertenece a la clase entonces no es posible acceder a ella por medio de una instancia la única forma de acceder a ella es por medio de la clase [nombre de la clase].X siempre y cuando se publico.

Ahora entienden el poder de singleton esto nos lleva a ver que podemos utilizarlo en muchas situaciones ya que no importa si estamos en la misma función o en la misma sesión siempre que yo la llame obtendré la misma instancia. Imaginen lo que pueden hacer con esto. En mi caso yo lo he utilizado mucho en aplicaciones muli-hilos, aplicaciones que usan sockets pero en fin se los dejo a su imaginación.

Como pueden ver el diseño de singleton no es muy complejo al contrario espero que con esto puedan empezar a realizar sus sistemas incorporando singleton.

 


ir al índice