Entwurfsmuster Singleton Pattern
Das Singleton-Pattern beschreibt eine Klasse, die nur einmal instanziiert werden kann, auf dessen einzige Instanz aber ein globaler Zugriff möglich ist.
Das Singleton-Pattern stellt somit eine Art verbesserte globale Variable dar.
Anwendbar ist das Singleton-Pattern immer dann, wenn für eine Applikation einzigartige Objekte modelliert werden sollen. In einem Spiel z.B. soll es immer nur genau eine Welt geben. Die Drucker eines Systems müssen durch genau einen Druckermanager verwaltet werden. Es gibt viele Beispiele für solche einzigartigen Objekte. Ihre Einzigartigkeit wird durch den vom Singleton-Pattern beschriebenen Typ garantiert. Dieser instanziiert sich selbst, bietet anderen aber keine Möglichkeit weitere Instanzen zu erzeugen.
Hier mal ein Beispiel:Datei:
Quelldateien/main.cpp- #include <iostream> // std::cout, std::endl, std::cin
- #include <stdlib.h> // EXIT_SUCCESS
-
- class Singleton
- {
- private:
- static bool instanceFlag;
- static Singleton *single;
- Singleton()
- {
- //private constructor
- }
- public:
- static Singleton* getInstance();
- void method();
- ~Singleton()
- {
- instanceFlag = false;
- }
- int count = 0;
- };
-
- bool Singleton::instanceFlag = false;
- Singleton* Singleton::single = NULL;
- Singleton* Singleton::getInstance()
- {
- if (!instanceFlag)
- {
- single = new Singleton();
- instanceFlag = true;
- return single;
- }
- else
- {
- return single;
- }
- }
-
- void Singleton::method()
- {
- this->count++;
- std::cout << "Starting Class for " << this->count << " time!" << std::endl;
- }
-
- int main()
- {
- Singleton *sc1 = Singleton::getInstance();
- sc1->method();
- sc1 = NULL;
- delete sc1;
- Singleton *sc2 = Singleton::getInstance();
- sc2->method();
-
- std::cin.get();
- return EXIT_SUCCESS;
- }
Im Beispiel wurde mal wieder darauf verzichtet, die Header Datei sowie die eigentliche Klassen definition auszulagern da es so verständlicher ist.
Mit "static bool instanceFlag;" speichern wir einen booleschen Wert der bei true besagt, dass diese Klasse bereits instanziiert worden ist. Wenn das der Fall ist, wird bei "static Singleton* getInstance();" einfach "static Singleton *single;" zurück gegeben. Falls nicht, wird in single einfach eine neue Instanz der Klasse gespeichert, instanceFlag auf true gesetzt und single zurück gegeben.
Die main() Funktion ruft als erstes "Singleton *sc1 = Singleton::getInstance();" auf. Da es noch keine Instanz der Klasse gibt, wird sie erstellt. Anschliessend rufen wir die Methode "sc1->method();" auf, sie gibt einen Text aus der einen Counter vom Aufruf beinhaltet. Danach löschen wir sc1 wieder. Im nächsten Schrit erstellen wir wieder einen Zeiger auf die Klasse mit "Singleton *sc2 = Singleton::getInstance();" und rufen die Methode "sc2->method();" auf. Hiermit sollte jetzt klar sein, was ein Singleton-Pattern bewirkt! Wir werden dieses Pattern später im SFML Tutorial nutzen um z.B. die Game Klasse zu Instanziieren.