# Liste von Singleton-Implementierungen

Dies ist eine Liste von Implementierungen des Entwurfsmusters Singleton in unterschiedlichen Programmiersprachen.

## Implementierung in ActionScript
### Ab Version 2

(ohne Schutz vor direkter Instanziierung)

### Ab Version 3

In ActionScript 3 können Konstruktoren nicht als privat deklariert werden. Eine mögliche Lösung besteht darin, mittels einer privaten Klasse sicherzustellen, dass der Konstruktor nur von innerhalb der Singletonklasse aufgerufen werden kann:

## Implementierung in C#
### Allgemein ohne Threadsicherheit

Verwendung:

### Threadsicher

Eine threadsichere Methode, entnommen aus dem MSDN-Magazin.
Verwendung:
Das Singleton-Prinzip wird bei C# durch zwei Maßnahmen erreicht:
* Durch die Deklaration des Konstruktors als privat (private Singleton) kann dieser von außerhalb der Klasse nicht mehr aufgerufen werden – das Erstellen des Objektes ist also nur noch von innerhalb der Klasse möglich.
* Das statische öffentliche Feld Instance speichert und liefert schreibgeschützt Zugriff auf das einzige Objekt der Klasse.

#### Wichtig

    Der Konstruktor wird von der CLR nicht automatisch beim Programmstart aufgerufen. Erst beim ersten Zugriff auf eine Klasse werden alle statischen Member der Klasse initialisiert – in diesem Fall die Instanziierung des einen Objektes. Wenn also nie auf diese Klasse zugegriffen wird, wird der Konstruktor auch niemals ausgeführt – und das Objekt wird nie erstellt. Dieser Effekt tritt auch dann noch ein, wenn die Klasse selbst als statisch deklariert wird.
Möchte man sichergehen, dass das Singleton-Objekt beim Programmstart erstellt wird, so muss man einen beliebigen Zugriff in das Hauptprogramm (public static void Main { }) einbauen.

### Threadsicher mit doppelt überprüfter Sperrung

Bei der doppelt überprüften Sperrung handelt es sich um ein Antimuster. Jedoch funktioniert diese Variante threadsicher und wird oft von unerfahrenen Entwicklern eingesetzt.
Verwendung:
Hinweise zum Code:
* Das private Hilfsobjekt _lock ist hier unbedingt notwendig. Die frühere gängige Methode lock(this){ … } hat sich als unzureichend herausgestellt, weil fehlerhafter oder böswilliger Code durch den Aufruf Monitor.Exit(Singleton); die Threadsicherheit einfach aushebeln kann.
* Double-Lock-Muster: Damit nach der Instanziierung des Objektes die bremsende Synchronisation per lock wegfällt, wird dieselbe If-Abfrage zusätzlich vor dem Lock-Abschnitt eingesetzt.
* Das Schlüsselwort volatile bewirkt, dass die Instanz von mehreren Threads gleichzeitig bearbeitet werden kann.
Falls es keine konkreten Einwände gibt, dass das Singleton-Objekt auch schon früher instanziiert werden darf, ist der vorher beschriebene Code einfacher und schneller und daher in C# vorzuziehen.

### Threadsicher mit Synchronisation

Eine Umgehung des Double-Lock-Antimusters ist die Verwendung des MethodImpl-Attributs um einen synchronisierten Methodenaufruf zu gewährleisten. Dies entspricht dem Schlüsselwort synchronized in Java.
Verwendung:

### Generisch

Eine einfache generische Variante
Bei dieser Variante kann das Delegat-Konstruktor-Handshake-Pattern eingesetzt werden um sicherzustellen, dass der öffentliche parameterfreie Konstruktor nur von der generischen Singleton-Klasse aufgerufen werden kann:
Alternativ kann System.Reflection oder System.Diagnostics verwendet werden um Informationen über die aufrufende Objekt zu erhalten. Hierzu muss das aufzurufende Objekt im Konstruktor übergeben und analysiert werden. Zudem wird dabei nicht die new-Bedingung erfüllt, weshalb das entsprechende Konstrukt entfernt werden muss.

### Generisch mit statischer Fabrikmethode

Bei dieser Variante wird eine statische Fabrikmethode verwendet um die Singleton-Instanz zu erzeugen.
Einsatz:
Verwendung:

### Generisch, Abstrakt

Einsatz:
Verwendung:

### Generisch, Abstrakt, Lazy

Dies ist eine generische abstrakte Klasse die eine Singleton-Instanz lazy erzeugt.
Einsatz:
Verwendung:

### Generisch mit Aufruf eines privaten Konstruktors über Reflexion

Die folgende Variante ruft einen privaten Konstruktor über Reflexion auf:
Einsatz:
Verwendung:

## Implementierung in C++

Die Implementierung im Buch Entwurfsmuster ist nur für Single-Thread Programme geeignet. Bei Multi-Thread Programmen muss die get Methode durch ein Mutex geschützt werden. Diese C++11 Single-Thread Implementierung basiert auf der vor C++98 Implementierung im Buch Entwurfsmuster.
Die Programmausgabe ist:
Das Meyers Singleton nutzt eine statische Variable in der Methode get. Deshalb gibt es keine destruct Methode. Die Programmausgabe ist wie oben.
Dritte Methode: Bietet eine Basisklasse, um auf einfachste Weise eine Klasse als Singleton auszuweisen.

## Implementierung in Delphi
### Implementierung ab Delphi 5

Aufruf:

### Implementierung ab Delphi 2007

Aufruf:

## Implementierung in Java
### Enum

Gemäß Joshua Bloch ist die beste Art, ein Singleton in Java zu implementieren, die folgende:
Verwendung:
Diese Art funktionierte ab Java Version 5, da erst mit dieser Version Enums eingeführt wurden.

### Allgemein

Die Erstellung des einmalig existierenden Objekts wird folgendermaßen erreicht:
* Der Konstruktor der Singleton-Klasse ist privat. So ist es von außen nicht möglich, ein weiteres Objekt dieser Klasse zu erzeugen.
* Als Ersatz wird eine neue Zugriffsmethode angelegt, die eine Referenz auf das einzige Objekt zurückgeben kann.
* Die Variable, in der das Objekt gespeichert wird, erhält den Modifikator „statisch“ (static). Sie ist außerdem synchronisiert, um die Sicherheit bei nebenläufiger Ausführung zu gewährleisten. In Java wird auch dabei das Objekt erst erzeugt, wenn es gebraucht wird.
Nachteil dieser Variante ist, dass auch nach der Instanziierung jeder Lesezugriff über getInstance synchronisiert ist und so mehrere gleichzeitig zugreifende Threads sich gegenseitig blockieren. Implementierungen, die mittels „double-checked locking“ bei bereits existierender Instanz auf die Synchronisation verzichten, sind im Allgemeinen nicht threadsicher.

### Lazy-Instantiierung

In Java ist diese Implementierung dem Lazy-Creation-Ansatz vorzuziehen. Die Initialisierung findet durch das späte Initialisieren der Klasse erst statt, wenn die Klasse Singleton referenziert wird. Da der Zugriff nur via getInstance erfolgt, ist dies auch der spätest mögliche Zeitpunkt und entspricht somit der Lazy-Evaluation ohne den Synchronisierungs-Overhead.
Hierdurch können andere statische Methoden von Singleton gerufen oder in dieser definierte Konstanten referenziert werden, ohne INSTANCE bereits zu erzeugen.

## Implementierung in Perl

Die Methode instance gibt $instance zurück, bzw. initialisiert es vorher noch, wenn dies noch nicht geschehen ist.
Dies kann dann mit dem folgenden Code genutzt werden:

### Threadsicher

Hier wird $instance bereits bei der Initialisierung von Singleton angelegt. Durch das :shared wird das Beispiel außerdem thread-safe.

### Mit CPAN-Modul

Etwas erweiterte Funktionalität bietet das CPAN-Modul Class::Singleton.

## Implementierung in Python
### Ab Python Version 2.2
### Borg-Pattern

Unter Python gibt es auch mehrere Ansätze für das Singleton-Entwurfsmuster. Eine Umsetzung des Monostate-Prinzips ist auch als Borg-Pattern bekannt:

## Implementierung in Visual Basic .NET

Die folgende Implementierung ist threadsicher.