Singleton (Design Pattern)
Aus Byte-Welt Wiki
Version vom 16. September 2008, 13:36 Uhr von EagleEye (Diskussion | Beiträge)
Das Singleton, im Deutschen auch Einzelstück genannt, ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Creational Pattern (Erzeugungsmuster). Das Muster ist eines der von der so genannten Viererbande (GoF) publizierten Muster.
Inhaltsverzeichnis
Zweck
Es stellt sicher, dass zu einer Klasse nur genau ein Objekt erzeugt werden kann und ermöglicht einen globalen Zugriff auf dieses Objekt.
Motivation
Das Singleton findet Verwendung, wenn
- nur ein Objekt zu einer Klasse existieren darf und ein einfacher Zugriff auf dieses Objekt benötigt wird oder
- wenn das einzige Objekt durch Unterklassenbildung spezialisiert werden soll.
Anwendbarkeit
Anwendungsbeispiele sind:
- Ein zentrales Protokoll-Objekt, das Ausgaben in eine Datei schreibt.
- Druckaufträge, die zu einem Drucker gesendet werden, sollen nur in einen einzigen Puffer geschrieben werden.
Struktur
Singleton |
---|
– instance : Singleton |
– Singleton() |
+ getInstance() : Singleton |
Teilnehmer/Interaktion
In Klammer stehen die Bezeichnungen aus der Abbildung oben.
- Singleton
- erzeugt und verwaltet einziges Objekt zu einer Klasse
- bietet globalen Zugriff auf dieses Objekt über eine Instanzoperation
- die Instanzoperation ist eine Klassenmethode, d. h. statisch gebunden
- (das Attribut „Instanz“ (instance) ist ein Klassenattribut, d. h. ein statisches Attribut)
Konsequenz
Vorteile
- Das Muster bietet eine Verbesserung gegenüber globalen Variablen.
- Das Singleton kann durch Unterklassenbildung spezialisiert werden.
- Sollten später mehrere Objekte benötigt werden, ist eine Änderung leicht(er) möglich.
Nachteile
- Es besteht die große Gefahr, durch exzessive Verwendung von Singletons quasi ein objektorientiertes Äquivalent zu globalen Variablen zu implementieren.
- Der "Scope" eines Singletons - d.h. in welcher Umgebung ist das Singleton tatsächlich "einzeln"? - ist i. d. R. durch die Ablaufumgebung definiert, die nicht mit dem Bereich zusammenfallen muss, in dem das Singleton technisch oder fachlich "einzeln" sein soll. Z.B. ist in Java eine einfache static-Variable "einzeln je ClassLoader"; in verteilten (z.B. cluster-fähigen) Systemen oder komplexen nebenläufigen Applikationen wie Application-Servern können dadurch wieder mehrere Instanzen nebeneinander existieren. Analoges gilt für die so genannten App-Domains in .Net. Im Zusammenhang mit Generischen Typen kann die Semantik von static-Variablen nocheinmal komplexer sein (und ist etwa in Java und C# unterschiedlich!).
- Die Testability von Singletons ist schlecht. Das Mocken eines Singleton-Objekts, z.B. eines Netzwerkzugriffs ist aufwändig und in manchen Fällen - z.B. wenn für Testzwecke Fehler erzeugt werden sollen - fast unmöglich.
- Da der Konstruktor eines Singletons private ist kann man von ihm nicht erben.
Beispiele
Verwandte Entwurfsmuster
Die Eigenschaften des Singleton treffen für viele Klassen der anderen Muster zu, so dass diese dann als Singleton ausgeführt werden.
Zum Beispiel sind Abstract Factory, Builder oder Prototype oft auch Singleton.
Quellen
Weblinks
- Singleton (englisch)
- Java VM Specification (englisch)
- Beispiel für die Implementierung des Singleton-Patterns in Java
- Exploring the Singleton Design Pattern (englisch)
- Double Checked Locking is broken in Java (englisch)