Das Singleton Muster (Singleton Pattern) ist ein Entwurfsmuster in der Sofwareentwickung, welches beschreibt, das man ein Objekt nur einmal instanziieren darf.
Was genau wird realisiert?
Der Konstruktor des Objektes wird auf private gesetzt. Dies hat zur Folge, das man keine Instanz mit dem new Operator erstellen kann. Danach wird eine statische Methode erstellt, die eine neue Instanz des Objektes zurück gibt. In dieser Methode wird überprüft, ob es schon eine Instanz gibt, anhand einer statischen Membervariable. Das wars. Eingesetzt wird dies unter anderem bei Winforms, damit man ein Fenster nicht mehrfach erzeugen kann.
class Singleton { /** * @var Singeleton */ private static $_instance; /** * Kontruktor MUSS logischerweise auf private gesetzt werden */ private function __construct() { /* beliebiger CODE */ } /** * @return Singleton */ public function getInstance() { if (self::$_instance == null || !(self::$_instance instanceof Singeleton)) { self::$_instance = new Singleton(); } return self::$_instance; } } // aufruf $mySingletonOnject = Singleton->getInstance(); |
Quelle: Wikipedia DE
// Nur zur Veranschaulichung – bitte nicht verwenden! sealed class Singleton { private Singleton() { /* beliebiger CODE im Kontruktor */ } private static Singleton _instance = null; public static Singleton getInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } // Diese Version verwenden, wegen der ThreadSicherheit sealed class Singleton { private Singleton() { /* beliebiger CODE */ } private static volatile Singleton _instance = null; public static Singleton getInstance() { // DoubleLock if(_instance == null) { lock(m_lock) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } // Hilfsfeld für eine sichere Threadsynchronisierung private static object m_lock = new object(); } // Zugriff über Singleton Singleton MySingletonObject = Singleton.getInstance(); |
Für weitere Informationen zu Singleton oder weiteren Design Pattern empfehle ich folgende Links
- Singleton
- Singleton WIKIPEDIA
- http://www.dofactory.com/Patterns/Patterns.aspx
- http://de.wikipedia.org/wiki/Entwurfsmuster
- Dirk Primbs – Singleton
Edit: eine erweiterte Variante, basieren auf Dirk Primbs Post
sealed class Singleton { // > c# 2008 - Hier wird eine statische Variable erzeugt, die mit // volatile => Threadsafe // readonly => mit dem Schlüsselwort stellen wir sicher, das keine neue Instanz erzeugt wird public static readonly volatile Singleton Instance = new Singleton(); public string Name {get; set; } // Konstruktor auf private private Singleton() { /* beliebiger CODE */ } } // Testing var x = Singleton.Instance; x.Name = "Hans"; var y = Singleton.Instance; y.Name = "Werner"; // Beide Ausgaben ergeben Werner, weil es nur eine Instanz des Objektes zurückgegeben wird Console.WriteLine("X: " + x.Name); Console.WriteLine("Y: " + y.Name); Console.ReadLine(); |
Ehm ist das nicht ein wenig kompliziert?
public static readonly Singleton Instance = new Singleton();
geht doch auch und ist Threadsafe. Denn soweit ich mich recht entsinne sind static Variablen immer Threadsafe.
http://blogs.msdn.com/dirkpr/archive/2005/08/23/455155.aspx
Hallo Dominic,
vielen Dank, aber es liegt nicht nur an dem Schlüsselwort static. Das eigentliche Schlüsselwort, welches die Threadsicherheit gewährt, ist meines Erachtens das Schlüsselwort volatile.
Ich habe mal eine stark verkürzte Variante eines einfachen Singleton Musters geposted.
Vielen Dank für den Hinweis
Hebt sich readonly und volatile nicht irgendwie auf?
readonly sagt das etwas nicht geändert werden darf – volatile sorgt dafür das ein Wert von mehreren Thread gleichzeitig geändert werden kann.
Daher ist auch der Kompilerfehler den ich unter VS 2005 bekomme für mich nicht wirklich verwunderlich.
Hat sich da vielleicht in den neueren Versionen was geändert?
Was für ein Plugin benutzt du für WordPress, um den Code so schön darzustellen?
Das wäre wirklich super, dann könnte ich bei mir auch mal ein paar Code-Schnipseln bloggen. 🙂
Hallo Christopher,
das Plugin nennt sich WP-Syntax. Es ist aufgebaut mit dem GeSHi – Generic Syntax Highlighter
Ziemlich coolen Plugin mit vielen Möglichkeiten.
Viele Grüße,
Christian