domingo, 18 de noviembre de 2007

Singleton: el Gentleman

También conocido en mi ambiente de trabajo como chicletón :-D es quizá uno de los patrones de diseño más utilizados. Como muchos sabréis, asegura que una clase tenga una única instancia además de poseer la característica de ser un punto global de acceso a ella para toda la aplicación. Todo un caballero, sí señor...

En C# la forma más eficiente y segura de aplicar este patrón es la siguiente:
public sealed class Singleton 
{
    private Singleton() {}
    public static readonly Singleton Instance = new Singleton();
}

Es segura porque es el propio compilador el encargado de asegurar el Thread-Safe en la inicialización de la clase. Es eficiente porque evitamos la pérdida de rendimiento si utilizáramos una implementación mediante la cláusula volatile aplicando, por ejemplo, otro patrón interesante: Double Checked Lock. Veamos cómo:

public sealed class Singleton 
{
   private Singleton() {}
   private static volatile Singleton instance;
   private static object syncRoot = new object();
 
   public static Singleton Instance 
   {
     get 
     {
        if (Singleton.instance == null) 
        {
           lock (syncRoot) 
           {
              if (Singleton.instance== null) 
              {
                 Singleton.instance= new Singleton();
              }
           }
        }
        return Singleton.instance;
     }
   }      
}

Otra implementación podría aplicarse en genéricos a partir de Framework 2.0, ya que versiones anteriores no soportan esta característica en el lenguaje.

No hay comentarios: