- 1. Ziele
- 2. Probleme
- 3. Diskussion
- 4. Struktur
- 5. Beispiel
- 6. Kontrollliste
- 7. Faustregeln
Ziele
- Stellen Sie sicher, dass die Klasse nur eine Instanz hat und einen globalen Zugriffspunkt darauf bereitstellt.
- Gekapselte „Initialisierung zu einem bestimmten Zeitpunkt“ oder „Initialisierung bei Erstbenutzung“.
Probleme
Eine Anwendung benötigt genau eine Objektinstanz. Außerdem sind verzögerte Initialisierung und globaler Zugriff erforderlich.
Diskussion
Machen Sie die Objektklasse dafür verantwortlich, eine einzelne Instanz zu erstellen, sie zu initialisieren, darauf zuzugreifen und sie durchzusetzen. Deklarieren Sie eine Instanz als privates statisches Datenelement. Stellen Sie eine öffentliche statische Memberfunktion bereit, die den gesamten Initialisierungscode kapselt und Zugriff auf die Instanz bietet.
Der Client ruft die Accessor-Funktion (unter Verwendung des Klassennamens und des Bereichsauflösungsoperators) auf, wenn ein Verweis auf ein Singleton-Objekt erforderlich ist.
Ein Singleton sollte nur in Betracht gezogen werden, wenn alle drei der folgenden Kriterien erfüllt sind: Der Besitz einer einzelnen Instanz kann vernünftigerweise nicht zugewiesen werden
- Das Eigentum an einer einzelnen Instanz kann vernünftigerweise keinem Objekt zugewiesen werden
- Wünschenswerte verzögerte Initialisierung
- Globaler Zugriff ist nicht vorgesehen
Ist eine der Bedingungen nicht erfüllt, dann ist der Singleton nicht besonders interessant.
Das Singleton-Muster kann erweitert werden, um den Zugriff auf eine anwendungsspezifische Anzahl von Instanzen zu unterstützen.
Struktur
Machen Sie die Singleton-Klasse der Instanz für den Zugriff und die "Initialisierung bei der ersten Verwendung" verantwortlich. Die einzelne Instanz ist ein privates statisches Attribut. Die Accessor-Funktion ist eine öffentliche statische Methode.
Beispiel
Das Singleton-Muster stellt sicher, dass eine Klasse nur eine Instanz hat, und bietet einen globalen Zugriffspunkt auf diese Instanz. Es ist nach dem Singleton-Set benannt, das als Set definiert ist, das ein Element enthält. Das Amt des Präsidenten der Vereinigten Staaten ist Singleton. Die Verfassung der Vereinigten Staaten bestimmt die Art und Weise, wie der Präsident gewählt wird, begrenzt die Amtszeit und bestimmt die Reihenfolge der Nachfolge. Infolgedessen kann es zu einem bestimmten Zeitpunkt höchstens einen amtierenden Präsidenten geben. Unabhängig von der Identität des Amtsinhabers ist der Titel „Präsident der Vereinigten Staaten“ ein globaler Hotspot, der eine Person in einem Amt identifiziert.
Kontrollliste
- Definieren Sie ein privates statisches Attribut in der Klasse "Sigleton".
- Definieren Sie eine öffentliche statische Zugriffsfunktion in der Klasse.
- Führen Sie eine "träge Initialisierung" (Erstellung bei der ersten Verwendung) in der Zugriffsfunktion durch.
- Definieren Sie alle Konstruktoren als privat oder geschützt.
- Clients können nur die Zugriffsfunktion verwenden, um mit Singleton zu arbeiten.
Faustregeln
- Abstract Factory, Builder und Prototype können Singleton in ihrer Implementierung verwenden.
- Fassadenobjekte sind oft Singletons, da nur ein Fassadenobjekt benötigt wird.
- Zustandsobjekte sind oft Singletons.
- Der Vorteil von Singleton gegenüber Globals besteht darin, dass Sie bei der Verwendung von Singleton die Anzahl der Instanzen absolut sicher kennen und auch den Code ändern können, um eine beliebige Anzahl von Instanzen zu verwalten.
- Das Singleton-Entwurfsmuster ist eines der unhandlicheren Muster. Singletons sollen verwendet werden, wenn eine Klasse genau eine Instanz haben muss, nicht mehr und nicht weniger. Entwickler verwenden Singletons oft in einem fehlgeleiteten Versuch, globale Variablen zu ersetzen. Singleton wird globale Variablen nicht abschaffen; es benennt sie nur um.
- Wann wird ein Singleton nicht benötigt? Kurze Antwort: meistens. Lange Antwort: Wann ist es einfacher, die Ressource eines Objekts als Referenz an die Objekte zu übergeben, die sie benötigen, anstatt den Objekten global auf die Ressource zugreifen zu lassen? Das eigentliche Problem mit Singletons ist, dass sie Ihnen eine so gute Ausrede liefern, nicht über die entsprechende Objektsichtbarkeit nachzudenken. Das Finden der richtigen Balance zwischen Exposition und Objektschutz ist entscheidend für die Aufrechterhaltung der Codeflexibilität.