Singleton-Muster
Kurz: Das Singleton-Muster stellt sicher, dass es von einer Klasse nur eine einzige Instanz gibt, und bietet dafür einen globalen Zugriffspunkt.
Genauer: Typische Kandidaten sind Konfigurationsobjekte, Logger oder Verbindungspools. Das Muster ist umstritten, weil es versteckten globalen Zustand einführt und Tests erschwert. Oft ist Dependency Injection mit einer einmal erzeugten Instanz die bessere Wahl.
Im Detail
class Konfig:
_instanz = None
def __new__(cls):
if cls._instanz is None:
cls._instanz = super().__new__(cls)
cls._instanz.werte = {}
return cls._instanz
a = Konfig()
b = Konfig()
a.werte["port"] = 8080
print(b.werte["port"]) # 8080
print(a is b) # Truepublic enum Konfig { // thread-sicheres Singleton über enum
INSTANZ;
private int port = 8080;
public int port() { return port; }
}
// Zugriff: Konfig.INSTANZ.port()Worauf achten?
- Thread-Sicherheit: Bei verzögerter Erzeugung (lazy) können zwei Threads gleichzeitig zwei Instanzen anlegen. Lösungen: Initialisierung beim Laden,
synchronized,enum-Singleton (Java) oder Sprachmittel wie Module in Python/JavaScript, die nur einmal geladen werden. - Testbarkeit: Ein globaler Zustand überlebt zwischen Tests; sauberer ist es, das Objekt als Parameter zu übergeben.
- Skalierung: Ein Singleton gilt nur pro Prozess, nicht für mehrere Server.
Das Muster gehört zu den Erzeugungsmustern, wie auch das Factory-Muster.
Siehe auch: Factory-Muster, Dependency Injection, Klassen, Thread