EMZETT.
Login

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)            # True
public 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