2012-10-01 13 views
7

Singleton wdrażane z C# może być tak:Jaka jest różnica między właściwością statyczną a pojedynczą?

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

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

Jeśli używam statyczny wdrożyć to lubią:

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

w ten sposób, aplikacja powinna również uzyskać tylko jedno wystąpienie dla całej aplikacji. Jaka jest różnica między tymi dwoma podejściami? Dlaczego nie skorzystać bezpośrednio z elementu statycznego (prostszego i prostszego)?

Odpowiedz

8

Jeśli używasz drugie podejście:

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

Nic zapobiegania kogoś od robienia:

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

też nie dostać ten sam inicjalizacja leniwy swoją pierwszą wersję (próby) osiągnięcia plus używasz pola publicznego, które nie pozwala na taką samą elastyczność w przyszłości, jeśli musisz zmienić to, co dzieje się po pobraniu wartości.

Zauważ, że .NET 4 stanowi potencjalnie lepsze podejście do podejmowania pojedyncza:

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

    private Singleton() {} 

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

To jest dobre, bo to jest całkowicie leniwy i pełni wątku bezpieczne, ale również proste.

+0

Czy musimy zadeklarować konstruktora statycznego * * tu do wątku bezpieczny? –

+0

@CuongLe Nie z wersją 'Lazy '. Jest to bardzo miłe, ponieważ zapewnia właściwe bezpieczeństwo wątku i doskonałe leniwe tworzenie, za pomocą prostego interfejsu API. –

+0

Ah, tak, mam to, +1 –

-1

Poniżej są pewne różnice pomiędzy statyczną i Singleton:

  1. Singleton jest wzorcem podczas statyczny jest słowem kluczowym.
  2. Klasa Singleton może mieć metodę statyczną i niestatyczną, ale klasa statyczna może mieć tylko statyczne elementy i metody.
  3. Możemy zaimplementować interfejs w klasie Singleton, ale w klasie statycznej nie możemy zaimplementować interfejsu.
  4. Możemy rozszerzyć klasę Singleton, podczas gdy my klasy statycznej nie możemy, tj. Klasa Singleton może pochodzić z dowolnego typu klasy.

dłużej static vs Singleton

Powiązane problemy