2010-03-08 10 views
6

Ok, si creo una clase singleton y expongo el objeto singleton a través de una propiedad pública estática ... Lo entiendo.Singleton Properties

Pero mi clase singleton tiene otras propiedades. ¿Deberían ser estáticos? ¿Deberían ser también privados?

Sólo quiero ser capaz de acceder a todas las propiedades de mi clase singleton al hacer esto:

MySingletonClass.SingletonProperty.SomeProperty2 

Dónde SingletonProperty me devuelve la única instancia singleton. Supongo que mi pregunta es, ¿cómo expones las otras propiedades en la clase de singleton ... las haces privadas y luego accedes a ellas a través de tu propiedad estática de singleton público?

¿O deberían todas sus otras propiedades y métodos de un singleton ser públicas no estáticas?

+1

enlace obligatorio contra el uso de singletons: http://www.codingwithoutcomments.com/2008/10/08/singleton-i-love-you-but-youre-bringing-me-down/ y –

Respuesta

17

Una vez que obtenga el SingletonProperty (que es la única instancia de un objeto), cualquier cosa posterior se puede implementar como si estuviera creando una clase para instanciar porque Singleton es realmente una instancia única de un objeto normal.

Por ejemplo, la siguiente Singleton (obviamente no es el mejor diseño Singleton, pero tengan paciencia conmigo) ofrece hasta dos propiedades público llamado Valor y Nombre:

public class MySingleton 
{ 
    private static MySingleton _instance;  

    private MySingleton() { } 

    public static MySingleton Instance 
    { 
     get 
     { 
      if(_instance == null) 
       _instance = new MySingleton(); 

      return _instance; 
     } 
    } 

    // Your properties can then be whatever you want 
    public string Value { get; set; } 

    public string Name { get; set; } 
} 

acceder a estas propiedades se vería así:

MySingleton.Instance.Name = "StackOverflow"; 

MySingleton.Instance.Value = "Rocks!"; 
+0

gotcha. Mientras que el resto son todos públicos, la única forma de llegar a ellos es mediante cualquier propiedad que exponga la instancia de singleton. Gracias. – PositiveGuy

+0

y luego en el constructor privado pude establecer el estado allí ... – PositiveGuy

+3

Leer y escribir desde/a las propiedades de Nombre y Valor no son seguras para subprocesos; necesitarías utilizar un objeto de bloqueo en cada propiedad desafortunadamente. –

2

Haz que sean propiedades públicas como lo harías con cualquier otra clase. Usar el patrón singleton sería independiente de esto.

1

Mientras no sean estáticas, necesita una instancia de objeto para acceder a la propiedad. Y si la única forma de crear la instancia del objeto es a través del patrón singleton, las propiedades de su clase son intrínsecamente parte de la instancia de una sola clase. No se requiere nada especial.

2

No, déjalos ser públicos. Como solo puede haber una instancia de la clase, la única forma de acceder a esas propiedades será a través de la instancia única.

0

Su MySingletonClass.SingletonProperty devuelve una referencia a una instancia de la clase Singleton. Por lo tanto, puede usar propiedades públicas (y métodos similares) como cualquier otra instancia de una clase.

MySingletonClass.SingletonProperty.SomeProperty2 

Cuando usted haría SomeProperty2 estática, se puede hacer lo siguiente (pero esto no está en el espíritu del patrón de diseño Singleton):

MySingletonClass.SomeProperty2 
1

Deben ser bienes de dominio público no estáticos.

Piénsalo así. Tienes una única instancia de esta clase, pero sigue siendo una instancia.

Por lo tanto, hace que su constructor sea privado y crea una propiedad estática que maneje la instanciación lenta.

Todas las otras propiedades, miembros y métodos solo deberían ser parte de la instancia; una instancia que ahora se ha asegurado, será la única.