Erzeugungsmuster: Singleton-Pattern

Beim Singleton-Pattern, einem Entwurfsmuster, geht es um die Anzahl der Instanzen einer Klasse. Mit Hilfe von des Singleton-Pattern wird sichergestellt, dass von einer Klasse nur eine Instanz erstellt werden kann. Klassische Beispiele für die Verwendung des Singleton-Pattern sind Datenbank- oder Logging-Klassen.

Dieses Pattern verhindert das Erstellen von Instanzen durch den Konstruktor. Der ganze Trick besteht darin, den Konstruktor “private” zu setzen, sodass dieser nur intern verwendet werden kann. Zudem braucht es einen statischen Member in der Klasse, der den Status der Instanz hält.

Um trotzdem an eine Instanz zu kommen, wird eine öffentliche Methode implementiert. In dieser wird – wen noch nicht vorhanden – ein Objekt der Klasse erstellt, und zurückgegeben.

Was bei der Umsetzung des Singleton-Pattern in PHP häufig vergessen wird, ist die __clone-Methode. Auch wenn man keine Instanze über new erstellen kann, bietet PHP das Klonen an: Über __clone() erhält man eine Kopie (keine Referenz) des Objektes, so dass die Anforderung nach der Einmaligkeit des Objektes nicht garantiert werden kann.

Um dies zu verhindern, muss nur die __clone()-Methode auf private” gesetzt werden. So wird ein Aufruf von außerhalb der Klasse unterbunden.

Nach der Theorie hier das Singleton-Pattern in PHP umgesetzt:

class Logger  {

private static $instance = null;

protected function __construct() {}
private function __clone() {}

public static function getInstance() {
    if (self::$instance == null) {
    self::$instance = new self;
}
    return self::$instance;
}

public function writeLog(){
    return "nothing ...";
}

}
// Eine Instanz der Klasse erhält man über:
$logger = Logger::getInstance();

Somit sichert das Singleton-Pattern ab, dass von der Logger-Klasse nur eine Instanz existieren kann. Diese wird über die öffentliche Methode “getInstance” der Klasse erzeugt.

Eine weitere Variante in PHP ist das “generische Singleton”. Dies erzeugt und verwaltet alle angeforderten Objekte.

class Singleton  {

private static $instances = array();

public static function getInstance($className) {
    if (!isset(self::$instances[$className])) {
        self::$instances[$className] = new $className();
    }
    return self::$instances[$className];
}
}
//bsp:
require_once('logger.class.php');
$logger= Singleton::getInstance('Logger');

Die zu instantiierenden Klassen brauchen keine zusätzlichen Methoden, werden aber auch nicht durch das Schlüsselwort private vor dem mehrfachen Instantiieren geschützt, was in großen Projekten als Negativ zu bewerten ist. Diese Variante hat starke Ähnlichkeit mit dem Registry Pattern.

Dieser Beitrag wurde unter Code-Schnipsel, Enwurfsmuster abgelegt und mit den Tags , , , , , , , , versehen. Setze ein Lesezeichen auf den Permalink.

Eine Antwort auf Erzeugungsmuster: Singleton-Pattern

  1. Simon sagt:

    Gut geschrieben! Und wie ich finde, ist das auch eine gute Erklärung für Leute, die sowas zum ersten Mal brauchen.

    Weiter so ;-)

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>