2012-10-01 66 views
7

Singleton implementado con C# podría ser así:¿cuál es la diferencia entre propiedad estática y singleton?

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 

Si uso estática para implementarlo como:

public static class Globals{ 
    public static Singleton Instance = new Singleton(); 
} 

de esta manera, la aplicación también debe obtener sólo un ejemplo para toda la aplicación. Entonces, ¿cuál es la diferencia entre estos 2 enfoques? ¿Por qué no usar miembros estáticos directamente (más simple y directo)?

Respuesta

8

Si se utiliza el segundo método:

public static class Globals{ 
    public static Singleton Instance = new Singleton(); 
} 

hay nada que impida a alguien de hacer:

Singleton anotherInstance = new Singleton(); // Violates singleton rules 

También no reciben la misma inicialización perezosa su primera versión (intentos de) lograr Además, está utilizando un campo público, que no le permite la misma flexibilidad en el futuro si necesita cambiar lo que sucede cuando se obtiene un valor.

Tenga en cuenta que .NET 4 proporciona un enfoque potencialmente mejor para hacer un producto único:

public class Singleton 
{ 
    private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(()=> new Singleton()); 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     return instance.Value; 
     } 
    } 
} 

Esto es bueno porque es totalmente vago y hilo totalmente seguro, pero también simple.

+0

¿Necesitamos declarar * * constructor estático en aquí para flujos seguros? –

+0

@CuongLe No con la versión 'Lazy '. Es muy bueno ya que proporciona la seguridad adecuada de los hilos Y la instanciación lenta y perfecta, con una API simple. –

+0

Ah, sí, lo tengo, +1 –

-1

A continuación se presentan algunas diferencias entre estática y Singleton:

  1. Singleton es un patrón estático, mientras que es una palabra clave.
  2. La clase Singleton puede tener un método estático y no estático, pero la clase estática solo puede tener miembros y métodos estáticos.
  3. Podemos implementar la interfaz en una clase Singleton pero en la clase estática no podemos implementar la interfaz.
  4. Podemos extender la clase Singleton mientras que la clase estática no podemos, es decir, la clase Singleton puede derivarse de cualquier tipo de clase.

para más static vs Singleton

Cuestiones relacionadas