Singleton-Muster

In der Softwaretechnik ist das Singleton-Muster ein Designmuster, das verwendet ist, um das mathematische Konzept eines Singletons, durch das Einschränken des instantiation einer Klasse zu einem Gegenstand durchzuführen. Das ist nützlich, wenn genau ein Gegenstand erforderlich ist, um Handlungen über das System zu koordinieren. Das Konzept wird manchmal zu Systemen verallgemeinert, die effizienter funktionieren, wenn nur ein Gegenstand besteht, oder die den instantiation auf eine bestimmte Anzahl von Gegenständen einschränken.

Es gibt Kritik des Gebrauches des Singleton-Musters, weil einige es als ein Antimuster betrachten, entscheidend, dass es überbeansprucht ist, führt unnötige Beschränkungen in Situationen ein, wo ein alleiniges Beispiel einer Klasse nicht wirklich erforderlich ist, und globalen Staat in eine Anwendung einführt.

In C ++ dient es auch, um von der Unvorhersehbarkeit der Ordnung der dynamischen Initialisierung zu isolieren, Kontrolle dem Programmierer zurückgebend.

Allgemeiner Gebrauch

  • Die Abstrakte Fabrik, der Baumeister und die Prototyp-Muster können Singleton in ihrer Durchführung verwenden.
  • Fassade-Gegenstände sind häufig Singleton, weil nur ein Fassade-Gegenstand erforderlich ist.
  • Staatsgegenstände sind häufig Singleton.
  • Singleton wird häufig globalen Variablen weil bevorzugt:
  • Sie beschmutzen den globalen Namenraum (oder, auf Sprachen mit namespaces, ihr nicht, namespace enthaltend), mit unnötigen Variablen.
  • Sie erlauben faule Zuteilung und Initialisierung, wohingegen globale Variablen auf vielen Sprachen immer Mittel verbrauchen werden.

Struktur

Durchführung

Die Durchführung eines Singleton-Musters muss das einzelne Beispiel und die globalen Zugriffsgrundsätze befriedigen. Es verlangt einem Mechanismus, auf das Singleton-Klassenmitglied zuzugreifen, ohne einen Klassengegenstand und einen Mechanismus zu schaffen, der Wert von Klassenmitgliedern unter Klassengegenständen anzudauern. Das Singleton-Muster wird durch das Schaffen einer Klasse mit einer Methode durchgeführt, die ein neues Beispiel der Klasse schafft, wenn man nicht besteht. Wenn ein Beispiel bereits besteht, gibt es einfach eine Verweisung auf diesen Gegenstand zurück. Um sicherzustellen, dass der Gegenstand kein anderer Weg realisiert werden kann, wird der Konstrukteur privat gemacht. Bemerken Sie die Unterscheidung zwischen einem einfachen statischen Beispiel einer Klasse und einem Singleton: Obwohl ein Singleton als ein statisches Beispiel durchgeführt werden kann, kann er auch träge gebaut werden, kein Gedächtnis oder Mittel, bis erforderlich, verlangend. Ein anderer bemerkenswerter Unterschied ist, dass statische Mitglied-Klassen keine Schnittstelle durchführen können, wenn diese Schnittstelle einfach ein Anschreiber nicht ist. So, wenn die Klasse einen durch eine Schnittstelle ausgedrückten Vertrag begreifen muss, muss es wirklich ein Singleton sein.

Das Singleton-Muster muss in Mehrgewindeanwendungen sorgfältig gebaut werden. Wenn zwei Fäden die Entwicklungsmethode zur gleichen Zeit durchführen sollen, wenn ein Singleton noch nicht besteht, müssen sie beide für ein Beispiel des Singletons überprüfen, und dann sollten nur ein den neuen schaffen. Wenn die Programmiersprache gleichzeitige in einer Prozession gehende Fähigkeiten hat, sollte die Methode gebaut werden, um als eine gegenseitig exklusive Operation durchzuführen.

Die klassische Lösung dieses Problems ist, gegenseitigen Ausschluss auf der Klasse zu verwenden, die anzeigt, dass der Gegenstand realisiert wird.

Beispiel

Die javanischen Programmiersprache-Lösungen zur Verfügung gestellt hier sind alle vor dem Faden sicher, aber unterscheiden sich in unterstützten Sprachversionen und faulem Laden. Seit Java 5.0 ist die leichteste Weise, einen Singleton zu schaffen, die enum Typ-Annäherung, die am Ende dieser Abteilung gegeben ist.

Faule Initialisierung

öffentliche Klasse Singleton {\

privater statischer Singleton _instance = ungültig;

privater Singleton {\ }\

öffentlicher statischer synchronisierter Singleton getInstance {\

wenn (_instance == ungültig) {\

_instance = neuer Singleton ;

}\

geben Sie _instance zurück;

}\

}

</Quelle>

Traditioneller einfacher Weg

Diese Lösung ist vor dem Faden sicher, ohne spezielle Sprachkonstruktionen zu verlangen, aber sie kann an der Indolenz von derjenigen oben Mangel haben. Das BEISPIEL wird geschaffen, sobald die Klasse von Singleton initialisiert wird. Das könnte sogar sein lange vorher getInstance wird genannt. Es könnte (zum Beispiel) sein, wenn eine statische Methode der Klasse verwendet wird. Wenn Indolenz nicht erforderlich ist oder das Beispiel früh in der Ausführung der Anwendung geschaffen werden muss, oder Ihre Klasse keine anderen statischen Mitglieder oder Methoden hat, die frühe Initialisierung veranlassen konnten (und so Entwicklung des Beispiels), kann diese (ein bisschen) einfachere Lösung verwendet werden:

öffentliche Klasse Singleton {\

privates statisches Endbeispiel von Singleton = neuer Singleton ;

//Privater Konstrukteur verhindert instantiation an anderen Klassen

privater Singleton {}\

öffentlicher statischer Singleton getInstance {\

geben Sie Beispiel zurück;

}\}\</Quelle>

Statische Block-Initialisierung

Einige Autoren beziehen sich auf eine ähnliche Lösung, die etwas Aufbereitung (z.B für die Fehlerüberprüfung) erlaubt. In diesem Sinn konnte die traditionelle Annäherung als ein besonderer Fall von diesem gesehen werden, weil der Klassenlader genau dieselbe Verarbeitung tun würde.

öffentliche Klasse Singleton {\

privates statisches Endbeispiel von Singleton;

statischer {\

versuchen Sie {\

Beispiel = neuer Singleton ;

} Fang (IOException e) {\

werfen Sie neuen RuntimeException ("Gestopfte, ein Fehler ist vorgekommen!", e);

}\

}\

öffentlicher statischer Singleton getInstance {\

geben Sie Beispiel zurück;

}\

privater Singleton {\

//...

}\}\</Quelle>

Die Lösung von Bill Pugh

Die Universität des Maryland Informatik-Forschers Bill Pugh hat über die Codeprobleme geschrieben, die dem Muster von Singleton, wenn durchgeführt, in Java unterliegen. Die Anstrengungen von Pugh auf dem "Zweimal kontrollierten sich schließen lassenden" Idiom haben zu Änderungen im javanischen Speichermodell in Java 5 und dazu geführt, was allgemein als die Standardmethode betrachtet wird, Singleton in Java durchzuführen. Die Technik, die als die Initialisierung auf Verlangen Halter-Idiom bekannt ist, ist so faul wie möglich, und arbeitet in allen bekannten Versionen Javas. Es nutzt Sprachgarantien über die Klasseninitialisierung aus, und wird deshalb richtig in allen mit Java entgegenkommenden Bearbeitern und virtuellen Maschinen arbeiten.

In der verschachtelten Klasse wird nicht früher Verweise angebracht (und hat deshalb nicht früher durch den Klassenlader geladen) als der Moment, den getInstance genannt wird. So ist diese Lösung vor dem Faden sicher, ohne spezielle Sprachkonstruktionen (d. h. oder) zu verlangen.

öffentliche Klasse Singleton {\ //Privater Konstrukteur verhindert instantiation an anderen Klassen privater Singleton {}\

/ * *

* SingletonHolder wird auf der ersten Ausführung von Singleton.getInstance geladen

* oder der erste Zugang zu SingletonHolder. BEISPIEL, nicht vorher.

*/

private statische Klasse SingletonHolder {

öffentliches statisches Endbeispiel von Singleton = neuer Singleton ;

}\ öffentlicher statischer Singleton getInstance {\

geben Sie SingletonHolder.instance zurück;

}\}\</Quelle>

Wechselweise, die innere Klasse Singletonholder kann auch durch das Einführen eines Eigentums eingesetzt werden, das auch Zugang den statischen endgültigen/read-only-Klassenmitgliedern zur Verfügung stellt. Gerade wie der faule Gegenstand in C#, wann auch immer der Singleton. Beispiel-Eigentum wird genannt, dieser Singleton wird für das allererste Mal realisiert.

Der Enum Weg

In der zweiten Ausgabe seines Buches "behauptet das Wirksame Java" Joshua Bloch, dass "ein einzelnes Element enum Typ die beste Weise ist, einen Singleton" für jedes Java durchzuführen, das enums unterstützt. Der Gebrauch eines enum ist sehr leicht durchzuführen und hat keine Nachteile bezüglich serialisierbarer Gegenstände, die auf die anderen Weisen überlistet werden müssen.

Publikum enum Singleton {\

BEISPIEL;

öffentliche Leere führt durch (Spannen Sie arg) {\

//... führen Sie Operation hier durch...

}\

}\</Quelle>

Die öffentliche Methode kann geschrieben werden, um irgendwelche gewünschten Typen von Argumenten zu nehmen; ein einzelnes Schnur-Argument wird hier als ein Beispiel verwendet.

Diese Annäherung führt den Singleton durch das Ausnutzen Javas Garantie durch, dass jeder Enum-Wert nur einmal in einem javanischen Programm realisiert wird. Seit Java enum Werte sind allgemein zugänglich, der Singleton auch. Der Nachteil besteht darin, dass der enum Typ etwas unbiegsam ist; zum Beispiel erlaubt es faule Initialisierung nicht.

Prototyp-basierter Singleton

Auf einer Prototyp-basierten Programmiersprache, wo Gegenstände, aber nicht Klassen verwendet werden, bezieht sich ein "Singleton" einfach auf einen Gegenstand ohne Kopien, oder das wird als der Prototyp für keinen anderen Gegenstand verwendet. Beispiel in Io:

Foo: = Gegenstand-Klon

Klon von Foo: = Foo

Beispiel des Gebrauches mit dem Fabrikmethode-Muster

Das Singleton-Muster wird häufig in Verbindung mit dem Fabrikmethode-Muster verwendet, um eine weites System Quelle zu schaffen, deren spezifischer Typ dem Code nicht bekannt ist, der es verwendet. Ein Beispiel, diese zwei Muster zu verwenden, ist zusammen Java Abstract Window Toolkit (AWT).

ist eine abstrakte Klasse, die die verschiedenen AWT Bestandteile zu besonderen heimischen Werkzeug-Durchführungen bindet. Die Klasse hat eine Fabrikmethode, die die mit der Plattform spezifische Unterklasse dessen zurückgibt. Der Gegenstand ist ein Singleton, weil der AWT nur einen einzelnen Gegenstand braucht, die Schwergängigkeit durchzuführen, und der Gegenstand relativ teuer ist, um zu schaffen. Die Werkzeug-Methoden müssen in einem Gegenstand und nicht als statische Methoden einer Klasse durchgeführt werden, weil die spezifische Durchführung durch die mit der Plattform unabhängigen Bestandteile nicht bekannt ist. Der Name der spezifischen verwendeten Unterklasse wird durch das "" Umgebungseigentum angegeben, das durch zugegriffen ist.

Die durch das Werkzeug durchgeführte Schwergängigkeit, erlaubt zum Beispiel, der sich rückwärts bewegenden Durchführung, zur mit der Plattform spezifischen Durchführung zu binden. Weder die Klasse noch die Anwendung mit dem Fenster müssen nicht bewusst sein, von denen die mit der Plattform spezifische Unterklasse des Gleichen verwendet wird.

Nachteile

Dieses Muster macht Einheit, die viel schwieriger prüft, weil es globalen Staat in eine Anwendung einführt. Es sollte auch bemerkt werden, dass dieses Muster das Potenzial für den Parallelismus innerhalb eines Programms reduziert, weil der Zugang zum Singleton in einem Mehrgewindezusammenhang z.B durch die Blockierung in Fortsetzungen veröffentlicht werden muss. Verfechter der Abhängigkeitseinspritzung würden das als ein Antimuster hauptsächlich wegen seines Gebrauches von privaten und statischen Methoden betrachten. Einige haben Weisen vorgeschlagen, die Singleton-Muster-Verwenden-Methoden wie Nachdenken auf Sprachen wie Java oder PHP zu brechen.

Links

ist

Asien Carrera / Liste der Literaturautoren von Kindern
Impressum & Datenschutz