Singleton

Problem

Die Anzahl der Objekte einer Klasse soll beschränkt werden.

Motivation

Oft ist nur ein Objekt oder ein Pool mit einer festen Anzahl von Objekten einer Klasse sinnvoll, beispielsweise bei der Kapselung von externen Ressourcen.

Lösung

Die Erzeugung von Objekten durch den new-Operator wird durch Deklaration des Konstruktors als protected oder private unterbunden. Das Klonen des Objektes wird durch die Deklaration der Methode __clone() als private final unterbunden.

Für die Objekterzeugung wird eine statische Methode, meist getInstance() oder singleton() genannt, bereitgestellt. In dieser Methode kann nun entschieden werden, ob ein neues Objekt der Klasse erzeugt wird oder ob eine Referenz auf ein bereits erzeugtes Objekt zurückgegeben werden soll.

Abbildung 5.1. Struktur des Singleton-Patterns

Struktur des Singleton-Patterns


Beispiel 5.5: Singleton

<?php
class Singleton {
  private static $uniqueInstance = NULL;
 
  protected function __construct() {
    print "Neues Objekt wird erzeugt.\n";
  }
 
  private final function __clone() {}
 
  public static function getInstance() {
    if (self::$uniqueInstance === NULL) {
      self::$uniqueInstance = new Singleton;
    }
 
    return self::$uniqueInstance;
  }
}
 
$a = Singleton::getInstance();
$b = Singleton::getInstance();
 
if ($a === $b) {
    print '$a und $b referenzieren dasselbe Objekt.'."\n";
}
?>
Neues Objekt wird erzeugt.
$a und $b referenzieren dasselbe Objekt.


Anwendungsbeispiele

Klassen, die externe Ressourcen wie beispielsweise Datenbankverbindungen kapseln, sind in der Regel gute Kandidaten für die Verwendung des Singleton-Musters. Mit seiner Methode getInstance() bietet dieses einen globalen Zugriffspunkt auf das (einzige) Objekt einer Klasse. Ohne diese Möglichkeit müsste beispielsweise in jeder Methode einer Anwendung, in der auf die Datenbank zugegriffen wird, ein neues Objekt der entsprechenden Klasse erzeugt werden oder aber ein solches Objekt als Parameter übergeben werden. Beide Alternativen zur Anwendung des Singleton-Musters sind "unschön", Erstere unter dem Aspekt der Performanz sogar ein großer Fehler.