Singleton a klasy statyczne

O wzorcu projektowym singleton napisałem już kiedyś sporawy post. Klasy statyczne są prostym mechanizmem i mogą przypominać singleton. Tak jak w singleton, w klasach statycznych mamy do dyspozycji wyłącznie jedną instancję obiektu. Również nie ma możliwości ręcznego stworzenia instancji obiektów. Czym się zatem te twory różnią?

1. Singleton może implementować interfejs lub dziedziczyć po bazowej klasie. Jest to poważna zaleta w stosunku do klasy statycznej. Dzięki temu można np.:

class XnaRenderer: IRenderer
{
    //...

}
class XnaRenderer: BaseRenderer
{
    //...

}

Singleton w pełni wspiera polimorfizm, dziedziczenie. Krótko mówiąc, singleton jest dużo bardziej obiektowy niż klasa statyczna.

2.  Singleton to obiekt i można go przekazać jako parametr. Nie zawsze istnieje taka potrzeba ale czasami np:

void Init(IRenderer renderer)
{
//....
}
void Main()
{
    // Unit testing
    Render(MockRenderer.Instance);    

}

Tak jak w poprzednim punkcie, singleton wciąż jest bardzo obiektowy. Klasa statyczna jest całkowicie globalna.

3.  Singleton umożliwia testy jednostkowe. Powyższe oba punkty pokazały już, że nie stoi nic na przeszkodzie aby stworzyć mock\stub.

4.  Jeśli chcemy dokonać serializacji, singleton można zapisać do pliku używając dostępnego API: XMLSerializer, BinaryFormatter, SoapFormatter itp.

5. Jeśli zależy nam na kontroli liczby instancji, singleton łatwo można przerobić. Klasa styczna jest zawsze jedna i nie da się tego wykonać. W niektórych systemach istnieje potrzeba stworzenia kilku instancji a nie tylko jednej.

Jeśli ktoś z Was zna jakieś inne przykłady, zachęcam do komentowania. Osobiście unikam klas statycznych jak mogę.

3 thoughts on “Singleton a klasy statyczne”

  1. Klasy statyczne świetnie sprawdzają się we wszelkiego rodzaju “nosnikach constów”. Również jako małe helperki. Używać z rozsądkiem i nic nikomu się nie stanie 😉

  2. Zgadza sie consty to dobre zastosowanie dla klas statycznych. Ale juz przechowywanie konfiguracji aplikacji nie. Singleton ma duzo wiecej zastosowan…

Leave a Reply

Your email address will not be published.