2013-08-28 11 views
7

Kiedy przechodzę przez różnice między klasą Singleton Vs Static, natknąłem się na jeden punkt, który możemy dziedziczyć interfejs w klasie singleton i możemy wywołać singleton poprzez interfejs dla wielu implementacji.jak używać interfejsu z pojedynczą klasą

Chciałbym demonstracji kodu z dobrym przykładem, jak orientacja obiektu może osiągnąć poprzez singleton, a nie poprzez statyczne.

Dzięki

+0

Czy możesz podać przykład "pseudokodu"? –

+0

co już wypróbowałeś? –

+0

co powiesz na wyszukanie jednego w google lub spróbuj go utworzyć samemu –

Odpowiedz

4

Chociaż trudno powiedzieć, co dokładnie masz na myśli, jeden wzór może mieć na myśli to Multiton pattern, gdzie możesz zarządzać mapę nazwanych wystąpień jako pary klucz-wartość.

To w zasadzie fabryki, ale każdy przypadek jest tworzony tylko raz:

Mam zmodyfikowano Wikipedia example nieco, aby pokazać, że można nawet czerpać z klasy Singleton, tak długo, jak konkretne implementacje są prywatne i w oryginalnej klasie:

class FooMultiton 
{ 
    private static readonly Dictionary<object, FooMultiton> _instances = 
     new Dictionary<object, FooMultiton>(); 

    // this is the classic good old singleton trick (prevent direct instantiation) 
    private FooMultiton() 
    { } 

    // you can also have private concrete implementations, 
    // invisible to the outside world 
    private class ConcreteFooMultitonOne : FooMultiton 
    { } 

    public static FooMultiton GetInstance(object key) 
    { 
     lock (_instances) 
     { 
      FooMultiton instance; 

      // if it doesn't exist, create it and store it 
      if (!_instances.TryGetValue(key, out instance)) 
      { 
       // at this point, you can create a derived class instance 
       instance = new ConcreteFooMultitonOne(); 
       _instances.Add(key, instance); 
      } 

      // always return the same ("singleton") instance for this key 
      return instance; 
     } 
    } 
} 

Ponadto, jeśli singleton nie jest klasą statyczną, może implementować dowolny interfejs, który chcesz. Jedyną rzeczą, która zapobiega pojedynczemu wzorcowi, jest instancja wielu instancji klasy singleton, ale to nie znaczy, że nie możesz całkowicie zastąpić implementacji czymś innym.

Na przykład, jeśli masz singleton, który nie jest statyczne klasy:

interface ICanTalk 
{ 
    string Talk(); 
} 

class Singleton : ICanTalk 
{ 
    private Singleton() { } 

    private static readonly Singleton _instance = new Singleton(); 
    public static Singleton Instance 
    { get { return _instance; } } 

    public string Talk() 
    { return "this is a singleton"; } 
} 

Można również mieć szereg różnych wdrożeń:

class OtherInstance : ICanTalk 
{ 
    public string Talk() 
    { return "this is something else"; } 
} 

to jesteś wolny, aby wybrać dowolny implementacja, jakiej potrzebujesz, ale uzyskaj tylko jedno wystąpienie klasy Singleton:

ICanTalk item; 

item = Singleton.Instance; 
item = new OtherInstance(); 
item = new YetAnotherInstance(); 
4

Według nkr1pr

Każda klasa może implementować interfejs, a Singleton jest tylko „normalne” klasa, która zapewnia, że ​​tylko jedna instancja tego istnieje w dowolnym momencie od siebie z innej logiki biznesowej może ją zaimplementować. Oznacza to również, że Singleton ma co najmniej 2 obowiązki i nie jest to dobry projekt OO, ponieważ zajęcia powinny mieć tylko jedną odpowiedzialność i upewnić się, że są one dobre na tej odpowiedzialności, ale to jest kolejna dyskusja.

Coś jak:

public interface MyInterface 
{ 
} 

I

public class MySingleton:MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+0

W języku C# klasa statyczna nie może zaimplementować interfejsu. –

+0

@ chris.house.00 jesteś w błędzie !!! spróbuj tego, a zobaczysz –

+1

Ale to nie jest klasa statyczna. Klasa statyczna = publiczna klasa statyczna MySingleton {} –

1

Nie jestem pewien, o co pytasz, ale klasy singleton mogą implementować interfejsy. Klasa singleton nie oznacza klasy statycznej, jedną z metod tworzenia instancji typu singleton jest w celu korzystania z elementów statycznych.

+3

Musisz zrobić sekundę 'if (instancja == null)' wewnątrz blokady, aby upewnić się, że nie ma dwóch wątków docierających do 'blokady' w tym samym czasie. W przeciwnym razie nadal możesz utworzyć wiele wystąpień singletonu. – Enigmativity

+0

W witrynie MSDN patrz [lock statement] (https://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.140%29.aspx). – DavidRR

Powiązane problemy