Zastosowanie
Kreacyjny wzorzec projektowy, charakteryzujący się jedną instancją danego obiektu oraz globalnym dostępem do funkcji getInstance(), dzięki czemu możemy uzyskać do niego dostęp praktycznie z każdego miejsca. Inną cechą charakterystyczną jest Lazy loading, czyli alokacja pamięci dla singletona występuje dopiero przy jego pierwszym wywołaniu (odwołaniu się do niego za pomocą funkcji getInstance()).
Własności singletona
ZALETY
- jest tworzony przy pierwszym wywołaniu,
- jest niszczony po zakończeniu działania programu,
- po utworzeniu istnieje tylko i wyłącznie jego jedna instancja,
- programista nie uczestniczy w procesie wywołania konstruktora, który zwykle jest prywatny lub zabezpieczony (protected), po to aby nie tworzyć więcej instancji obiektu singletona.
WADY
- Rozhermetyzowanie klas poprzez globalny dostęp,
- Trudniejsza analiza aplikacji podczas testów,
- Może powodować problemy podczas wykorzystania go w wielowątkowych procesach.
#include <qstring></qstring></qdebug>
class Ustawienia
{
public:
static Ustawienia & getSingleton()
{
static Ustawienia singleton; // lazy Loading
return singleton;
}
void setStyle(const QString style)
{
this->style = style;
}
QString getStyle(){return style;}
private:
QString style;
Ustawienia(): style("Unknown"){}
~Ustawienia(){}
};
class Klient
{
public:
Klient( )
{
Ustawienia::getSingleton().setStyle("Blue");
}
void whiteStyle()
{
Ustawienia::getSingleton().setStyle("White");
}
};
void funkcjaGlobalStyle()
{
qDebug() << Ustawienia::getSingleton().getStyle();
}
int main()
{
funkcjaGlobalStyle();
Klient klient;
funkcjaGlobalStyle();
klient.whiteStyle();
funkcjaGlobalStyle();
Ustawienia::getSingleton().setStyle("Red");
funkcjaGlobalStyle();
return 0;
}
Rezultat
"Blue"
"White"
"Red"