So erstellen Sie einen Singleton in C++

So Erstellen Sie Einen Singleton In C



In C++ ist ein Singleton ein Entwurfsprinzip, das das Vorhandensein einer einzelnen Instanz der Klasse im gesamten Programm sicherstellt und einen globalen Zugriffspunkt auf diese bestimmte Instanz bereitstellt.

Das Singleton-Muster wird häufig verwendet, wenn Sie eine einzelne, gemeinsam genutzte Ressource benötigen, auf die global zugegriffen werden soll, z. B. eine Datenbankverbindung, ein Logger oder ein Konfigurationsmanager. Durch die Durchsetzung einer einzelnen Instanz können mehrere Teile des Programms auf dasselbe Objekt zugreifen und es ändern, wodurch die Datenkonsistenz gefördert und der Bedarf an globalen Variablen verringert wird. Singleton kann als Objektcache verwendet werden, in dem häufig verwendete oder kostspielig zu erstellende Objekte gespeichert und in der gesamten Anwendung wiederverwendet werden. Dieser Ansatz trägt zur Verbesserung der Leistung bei, indem er die redundante Objekterstellung und -initialisierung vermeidet.

In diesem Artikel erklären wir die Erstellung eines Singletons und zeigen ein Beispiel für die Stilisierung eines Singletons in einem C++-Programm.







Beispiel 1: Erstellen eines einfachen Singletons mit Eager-Initialisierung

Ein einfacher Singleton mit früher Initialisierung ist ein Entwurfsmuster, das sicherstellt, dass nur eine Instanz einer Klasse erstellt wird, und diese wird während der statischen Initialisierung eifrig erstellt.



Wir demonstrieren den grundlegenden Codeausschnitt für die Erstellung eines einfachen Singletons mit Eager-Initialisierung. Beginnen wir mit dem Programm:



#include

Klasse Singleton {
Privat :
statisch Singleton * Beispiel ;
Singleton ( ) { }
öffentlich :
statisch Singleton * bekomme Instanz ( ) {
zurückkehren Beispiel ;
}
} ;


Singleton * Singleton :: Beispiel = neuer Singleton ( ) ;

int hauptsächlich ( ) {

Singleton * singletonInstance1 = Singleton :: bekomme Instanz ( ) ;

Singleton * singletonInstance2 = Singleton :: bekomme Instanz ( ) ;

std :: cout << „singletonletonInstance1:“ << singletonInstance1 << std :: endl ;

std :: cout << „singletonletonInstance2:“ << singletonInstance2 << std :: endl ;

zurückkehren 0 ;

}

Der Code enthält den Header , der die Funktionalität für die Arbeit mit Eingabe- und Ausgabestreams wie „std::cout“ bereitstellt.





Nachdem wir die Header-Datei eingebunden haben, definieren wir die „Singleton“-Klasse, die die Singleton-Musterimplementierung darstellt. Es verfügt über einen privaten Konstruktor und eine private statische Mitgliedsvariable namens „instance“.

Anschließend wird die Funktion getInstance() als öffentliche statische Memberfunktion der Klasse „Singleton“ implementiert. Es gibt die Instanz des Singletons zurück, die in der Instanz der statischen Mitgliedsvariablen gespeichert ist. Die Instanz der statischen Mitgliedsvariablen wird außerhalb der Klasse mit „Singleton* Singleton::instance = new Singleton();“ definiert und initialisiert. Diese Zeile initialisiert die Instanz der „Singleton“-Klasse während der statischen Initialisierung eifrig.



In der Funktion main() deklarieren wir zwei Zeiger, „singletonInstance1“ und „singletonInstance2“, und weisen den Wert zu, der durch den Aufruf von Singleton::getInstance() zurückgegeben wird. Da die Instanz eifrig initialisiert wird, zeigen beide Zeiger auf dieselbe Instanz. Die „std::cout“-Anweisungen geben die Speicheradressen von „singletonInstance1“ und „singletonInstance2“ mithilfe des „<<“-Operators und „std::endl“ an die Konsole aus.

Der Code endet mit einer „Return 0“, was eine erfolgreiche Programmausführung anzeigt.

Wenn Sie diesen Code ausführen, sieht die Ausgabe etwa so aus:

Die Ausgabe zeigt die Speicheradressen von „singletonInstance1“ und „singletonInstance2“ an. Da beiden Zeigern dieselbe Instanz zugewiesen ist, die von Singleton::getInstance() abgerufen wird, haben sie dieselbe Speicheradresse. Dies zeigt, wie das Singleton-Muster garantiert, dass es eine einzelne Instanz der Klasse gibt und dass zukünftige Aufrufe von getInstance() immer zur gleichen Instanz führen.

Beispiel 2: Singleton-Musterimplementierung mit verzögerter Initialisierung

Diese Demonstration erklärt die Singleton-Musterimplementierung mit verzögerter Initialisierung und zeigt ihre Verwendung in der Funktion main(). Die Schritt-für-Schritt-Erklärung des Codeausschnitts finden Sie im Anschluss an dieses Programm:

#include

Klasse Singleton {

Privat :

statisch Singleton * Beispiel ;

Singleton ( ) {

std :: cout << „Singleton-Instanz erstellt.“ << std :: endl ;

}

öffentlich :

statisch Singleton * bekomme Instanz ( ) {

Wenn ( Beispiel == nullptr ) {

Beispiel = neuer Singleton ( ) ;

}

zurückkehren Beispiel ;

}

Leere zeige Nachricht ( ) {

std :: cout << „Hallo aus Singleton!“ << std :: endl ;

}

~Singleton ( ) {

std :: cout << „Singleton-Instanz zerstört.“ << std :: endl ;

}

} ;

Singleton * Singleton :: Beispiel = nullptr ;

int hauptsächlich ( ) {

Singleton * singletonInstance1 = Singleton :: bekomme Instanz ( ) ;

singletonInstance1 -> zeige Nachricht ( ) ;

Singleton * singletonInstance2 = Singleton :: bekomme Instanz ( ) ;

singletonInstance2 -> zeige Nachricht ( ) ;

zurückkehren 0 ;

}

Das Programm beginnt mit dem Hinzufügen der Header-Datei , um die Eingabe-/Ausgabeaufgaben auszuführen. Anschließend deklarieren und definieren wir eine „Singleton“-Klasse. Die einzige Instanz der Klasse wird in der privaten statischen Mitgliedsvariablen mit dem Namen „instance“ gespeichert.

Immer wenn der Konstruktor der „Singleton“-Klasse aufgerufen wird, generiert er eine Instanz der „Singleton“-Klasse. Es gibt die Meldung „Singleton-Instanz erstellt“ mit „std::cout << … << std::endl;“ an die Konsole aus. Der Konstruktor hat keine Parameter, da es sich um einen Standardkonstruktor handelt. Es ist als Singleton() ohne Argumente definiert. Wir deklarieren es als privat, was bedeutet, dass es nur innerhalb der Klasse aufgerufen werden kann. Dies verhindert eine direkte Instanziierung der „Singleton“-Klasse und stellt sicher, dass die einzige Möglichkeit, eine Instanz zu erhalten, über die Funktion getInstance() ist.

Die Methode getInstance() der Klasse „Singleton“ wird als öffentliche statische Memberfunktion deklariert. Es hat die Aufgabe, den Zugriff auf die Singleton-Instanz einzurichten und zu gewähren. Innerhalb von getInstance() prüft es, ob die Instanz „nullptr“ ist. Wenn dies der Fall ist, was bedeutet, dass die Instanz noch nicht vorhanden ist, verwendet es den privaten Konstruktor, um ein neues Objekt der „Singleton“-Klasse zu instanziieren.

Die Funktion showMessage() ist eine einfache Memberfunktion, die die Nachricht „Hallo von Singleton!“ anzeigt. Nachricht. Der Destruktor von Singleton ist definiert. Es wird implizit aufgerufen, wenn das Programm beendet wird und die Meldung „Singleton-Instanz zerstört“ ausgibt. Nachricht, die angibt, dass die Singleton-Instanz zerstört wurde. Die Instanz der statischen Mitgliedsvariablen ist zunächst als „nullptr“ definiert.

Das int main() startet die Definition der main()-Funktion. Dann ist „Singleton* singletonInstance1 = Singleton::getInstance();“ ruft die Funktion getInstance() der Klasse „Singleton“ auf, um einen Zeiger auf die Singleton-Instanz zu erhalten. Es weist diesen Zeiger der Variablen „singletonInstance1“ zu.

Danach wird „singletonInstance1->showMessage();“ verwendet den Pfeiloperator (->), um die Funktion showMessage() für den Zeiger „singletonInstance1“ aufzurufen. Diese Funktion zeigt die darin angegebene Nachricht an der Konsole an. Danach wird „Singleton* singletonInstance2 = Singleton::getInstance();“ ruft die Funktion getInstance() erneut auf und erhält einen weiteren Zeiger auf die Singleton-Instanz. Diesmal weist es den Zeiger der Variablen „singletonInstance2“ zu. Die „singletonInstance2->showMessage();“ ruft die Funktion showMessage() für den Zeiger „singletonInstance2“ auf. Diese Funktion zeigt die Meldung „Hallo von Singleton!“ an. Nachricht erneut an die Konsole.

Zum Schluss „return 0;“ bedeutet das Ende der Funktion main() und das Programm gibt den Wert 0 zurück, was eine erfolgreiche Programmausführung bedeutet.

Hier ist die Ausgabe des zuvor erläuterten Codeausschnitts:

Dieses Ergebnis bestätigt, dass die Klasse „Singleton“ die Erstellung nur einer Instanz gewährleistet und dass weitere Aufrufe der Funktion getInstance() zuverlässig dieselbe Instanz liefern.

Abschluss

Das Erstellen eines Singletons in C++ ist ein sehr nützliches Konzept. In diesem Beitrag haben wir zunächst den Einführungsabschnitt von Singleton behandelt. Darüber hinaus werden zwei Beispiele zur Implementierung des Singletons in C++ erstellt. Die erste Abbildung zeigt die Implementierung der Eager-Singleton-Initialisierung. Die verzögerte Initialisierungsimplementierung des Singleton-Musters wird hingegen im zweiten Beispiel dieses Artikels bereitgestellt. Darüber hinaus werden auch die Snapshots der produzierten Ausgabe für die entsprechenden Programme angezeigt.