mijane Blog

ein paar interessante Sachen gibt es immer

Singleton sucks

Geschrieben von Peter Rother • Mittwoch, 25. November 2009 • Kategorie: Design Pattern

So könnte der Titel dieses Beitrags heißen, wenn ich das Singleton Pattern nicht doch mögen würde. Wie sich aber in der letzten Zeit herausgestellt hat, zählt es  bald nicht mehr zu den Design Patterns. Ich hatte zu dem Thema vor ein paar Wochen schon eine Diskussion mit Kore Nordmann. Er vertrat den Standpunkt, dass Singelton ein Anti - Pattern darstellt, ich vertrat meine Meinung, dass Singleton doch kein Anti – Pattern sei und wie sinnvoll es doch zu nutzen sei.

Da ich mir aber doch einiges annehme, was mir von den Jungs der PHP User Group Dortmund erzählt wird, machte ich mich doch ein wenig schlau darüber, was mir erzählt wurde. Die Meinungen zu dem Thema Singelton und Design Pattern gehen doch stark auseinander. Ich bin aber dann auch zu dem Entschluß gekommen, dass der ein Einsatz von Singleton doch ziemlich eingeschränkt ist. Den letzten Stoß in diese Richtung gab mir Cal Evans bei seinem Design Pattern Talk auf der International PHP Conference in Karlsruhe. Wie sich auch hier herausstellte, wird das Singleton in der nächsten Ausgabe der Gang of Four nicht mehr mit aufgeführt. Damit es aber nicht ganz aus dem Gedächtnis der Leute verschwindet und alle diese Struktur einmal zu Gesicht bekommen, habe ich mich dazu entschlossen, dass „Pattern“ hier einmal vorzustellen.


Singelton verfolgt den Ansatz, zu jeder Zeit im Programmablauf von einem Objekt immer nur eine Instanz zu erstellen. Bei einem Aufruf der Klasse die meistens durch den Aufruf einer
Statischen Methode getInstance() erfolgt, wird immer eine Instanz der eigenen Klasse zurückgegeben. Der Konstruktor der Klasse wird hierbei als private deklariert, damit die Klasse nicht über eine normale Instanz gebildet werden kann.


Das Grundgerüst der Klasse sieht meistens folgendermaßen aus:


class mySingeltonClass
{
private static $instance = false;

private function __construct(){}

public static function getInstance()
{
if( self::$instance === false ) {

self::$instance = new self;
}
return self::$instance;
}
}

Das ist auch schon alles bei einem Singleton. Es wird in der statischen Methode getInstance() geprüft, ob bereits eine Instanz der Klasse existiert, sollte dies nicht der Fall sein, wird eine Instanz der Klasse gebildet. In jedem Fall wird eine Instanz der Klasse zurück gegeben und mit dieser wird durchgehend gearbeitet.


In welchem Fall ist ein Singleton den nun nutzbar?

Generell besteht die Meinung, dass ein Singleton im Bereich einer Konfigurations Klasse zu nutzen sei. Ich würde es vielleicht noch im Bereich von Session und Cookie Klassen nutzen, da hier in den meisten Fällen auch eine einzige Instanz ausreicht. Die Meinungen werden hier mit Sicherheit auch weiter auseinander gehen und jeder sollte sich hierzu seine eigenen Gedanken machen. Was zu beachten sein sollte ist, dass „Pattern“ nicht zu exzessiv zu nutzen.


An dieser Stelle noch einmal einen Dank an Kore für den Schubser in die richtige Richtung.

Tags für diesen Artikel:
Tweet This!Tweet This!

0 Trackbacks

  1. Keine Trackbacks

2 Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)
  1. Naja, sofern man keine Klone oder dergleichen braucht, kann man Singleton-Funktionalität auch mit einer statischen Klasse erreichen (ich hoffe ich red grad kein Bullshit, aber es ist schon spät :-D)
  2. Das gravierendste Problem am Singleton: Es ist nicht anständig unit-testbar. Unit tests basieren darauf, dass einzelne Testfälle ganz und gar unabhängig von einander ausgeführt werden. Ruft dabei eine Methode das Singleton an, kann hier weder Code als Mocking injiziert werden, noch ist es möglich das Singleton-Objekt selbst in 2 Testfällen unabhängig von einander zu testen. Um mit einem Singleton halbwegs anständig zu testen, muss immer eine statische Methode ala setInstance() eingeführt werden, mit deren Hilfe sich das Singleton-Objekt austauschen lässt. Damit ist es aber kein Singleton mehr sondern letztendlich schon eine Registry. Ergo sollte man direkt auf Singletons verzichten und auf Registries setzen, sollte der Fall wirklich gegeben sein nur eine Instanz von einem bestimmten Objekt haben zu wollen. Damit bleiben auch OOP-Grundsätze wie Erweiterbarkeit gewahrt, denn in der Registry kann auch ein erbendes Objekt eingetragen werden.

Kommentar schreiben


Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss um dieses Verfahren anzuwenden.
CAPTCHA


Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!