Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Wzorce projektowe

singleton

[wzorzec projektowy] Zapewnia, że klasa posiada co najwyżej jedną instancję obiektu.

Budowa wzorca projektowego

C/C++
class CSingleton
{
private:
    CSingleton();
    CSingleton( const CSingleton & );
public:
    static CSingleton & getSingleton()
    {
        static CSingleton singleton;
        return singleton;
    }
   
    void metoda1();
    void metoda2( int argument );
    int metoda3( int argument );
};

Opis szczegółowy

Singleton (ang. singleton) - wzorzec projektowy, który ogranicza maksymalną ilość instancji obiektu do jedności. Własności singletona:
  • jest tworzony przy pierwszym odwołaniu się do niego;
  • jest niszczony po zakończeniu głównej funkcji programu;
  • w trakcie życia programu istnieje tylko i wyłącznie jego jedna instancja.

Zastosowanie

Singletony stosuje się zazwyczaj gdy chcemy posiadać globalny mechanizm dostępu do określonej funkcjonalności (np. logowania błędów).

Zaletą singletona w stosunku do zmiennej globalnej jest to, że zasoby zostaną jemu przydzielone dopiero wtedy, gdy zostanie on wywołany. Oznacza to, że:
  • jeżeli w trakcie życia aplikacji nie zostanie wywołany singleton to nie zostanie on utworzony;
  • inicjalizacja obiektu nie jest skumulowana w jednym punkcie, tj. w chwili uruchomienia aplikacji.
W konsekwencji dwóch powyższych punktów uzyskujemy oszczędność zasobów i wzrost szybkości ładowania aplikacji.

Inną istotną zaletą singletona jest jasno określony sposób uzyskiwania dostępu do globalnego zasobu.

Przykład

C/C++
#include <cstdio>
#include <fstream>
#include <iostream>

class CLog
{
private:
    std::fstream m_plik;
    CLog() { m_plik.open( "historia.log", std::ios::out ); }
    CLog( const CLog & ) { }
    ~CLog() { m_plik.close(); }
   
public:
    template < typename T >
    CLog & operator <<( const T & wypisz )
    {
        m_plik << wypisz;
        return * this;
    }
   
    static CLog & getSingleton()
    {
        static CLog singleton;
        return singleton;
    }
   
}; //class CLog

void funkcja1( int iValue )
{
    CLog::getSingleton() << "funkcja 1 = " << iValue * iValue << "\n";
}

void funkcja2( int iValue )
{
    CLog::getSingleton() << "funkcja 2 = " << iValue + iValue << "\n";
}

int main()
{
    funkcja1( 5 );
    funkcja2( 5 );
    return 0;
}
Inny przykład zastosowania singletona można zobaczyć w przykładzie wzorca projektowego » Wzorce projektowe » Wzorce czynnościowestrategia wzorzec projektowy.