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.
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.