Muster: Singleton
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Singleton
Das Singleton-Pattern wird benutzt, um genau eine Instanz einer Klasse und einen zentralen Zugriffspunkt auf diese Instanz bereitzustellen. Dies ist sinnvoll, wenn nur ein Objekt gebraucht wird, um Aktionen im System auszuführen. Die GoF-Pattern Abstract-Factory, Builder und Prototype können Singleton in ihrer Implementierung verwenden.
[Bearbeiten] Zweck
Bisweilen muss verhindert werden, dass von einer Klasse mehrere Instanzen erzeugt werden können - genau dies leistet das Singleton-Muster.
Ein Beispiel für solch einen Fall ist eine Klasse, die die Verbindung zu einer Datenbank verwaltet und für den Rest des Programms Funktionen zur Verfügung stellt, um auf die Datenbank zuzugreifen. Angenommen die Datenbank bietet selbst keine Mechanismen, um beispielsweise atomare Operationen zu gewährleisten; dies bleibt dann der Datenbankklasse vorbehalten. Gäbe es nun mehrere Instanzen dieser Datenbankklasse, könnten wiederum verschiedene Teile des Programms gleichzeitig Änderungen an der Datenbank vornehmen, indem sie sich unterschiedlicher Instanzen bedienen; kann sichergestellt werden, dass es nur genau ein Exemplar der Datenbankklasse gibt, tritt dieses Problem nicht auf.
[Bearbeiten] UML
[Bearbeiten] Entscheidungshilfen
Ein Singleton sollte dann eingesetzt werden, wenn sichergestellt sein muss, dass nicht mehr als ein Objekt einer Klasse erzeugt werden kann. Dabei ist jedoch genau zu überlegen, worauf sich "ein Objekt" bezieht: Pro Programm? Bei ge-cluster-ten Anwendungen: pro Cluster? Bei Java-Programmen: pro ClassLoader?
Singletons sind das semantische Äquivalent einer globalen Variablen, mit all den damit verbundenen Problematiken; es ist genau zu überlegen, ob das jeweilige Ziel nicht anders besser erreicht werden kann.
[Bearbeiten] Funktionsweise
Anstatt selbst eine neue Instanz durch Aufruf des Konstruktors zu erzeugen, müssen sich Benutzer der Singleton-Klasse eine Referenz auf eine Instanz über die statische getInstance()-Methode besorgen - die Singleton-Klasse ist also selbst für die Verwaltung ihrer einzigen Instanz zuständig. Die getInstance()-Methode kann nun sicherstellen, dass bei jedem Aufruf eine Referenz auf dieselbe und einzige Instanz - gehalten in einer (versteckten) Klassenvariable - zurückgegeben wird. Üblicherweise wird diese eine Instanz von getInstance() beim ersten Aufruf erzeugt.
In nebenläufigen Programmen muss der Programmierer beim Schreiben der getInstance()-Methode besondere Vorsicht walten lassen (siehe Code-Beispiele).
[Bearbeiten] Implementation
Konkrete Implementationen für die Programmiersprachen
[Bearbeiten] Verwandte Muster
- Fabrikmuster, da das Singleton üblicherweise eine Klassenfabrik für genau eine Instanz der eigenen Klasse darstellt


