Singleton -Musterkonzept:
Singleton -Muster in Java ist ein gemeinsames Designmuster. Das Singleton -Muster ist in drei Typen unterteilt: Lazy Singleton, Hungry Singleton und registrierter Singleton.
Der Singleton -Modus hat die folgenden Eigenschaften:
1. In einer Singleton -Klasse kann es nur eine Instanz geben.
2. Die Singleton -Klasse muss eine eigene einzigartige Instanz schaffen.
3. Die Singleton -Klasse muss diese Instanz allen anderen Objekten bereitstellen.
Das Singleton -Muster stellt sicher, dass eine Klasse nur eine Instanz hat und sie selbst instanziiert und diese Instanz für das gesamte System bietet. In Computersystemen werden Treiberobjekte für Threadpools, Caches, Protokollobjekte, Dialogfelder, Drucker und Grafikkarten häufig als Singletons entworfen. Diese Anwendungen haben mehr oder weniger die Funktionalität eines Ressourcenmanagers. Jeder Computer kann mehrere Drucker haben, aber es kann nur ein Druckerspooler verfügbar sein, um zu vermeiden, dass zwei Druckaufträge gleichzeitig an den Drucker ausgegeben werden. Jeder Computer kann über mehrere Kommunikationsports verfügen, und das System sollte diese Kommunikationsports zentral verwalten, um zu vermeiden, dass ein Kommunikationsport gleichzeitig von zwei Anfragen aufgerufen wird. Kurz gesagt, die Auswahl eines Singleton -Modells besteht darin, inkonsistente Zustände zu vermeiden und politische Bullität zu vermeiden.
Schauen wir uns zunächst eine klassische Singleton -Implementierung an.
öffentliche Klasse Singleton {private statische Singleton UniqueInstance = NULL; private Singleton () {// existiert nur zur Besiege der Instanziierung. } public static singleton getInstance () {if (UniqueInstance == null) {UniqueInstance = new Singleton (); } Rückkehr UniqueInstance; } // andere Methoden ...}Singleton vermeidet, dass die Klasse extern instanziiert wird, indem der Konstruktor auf private Beschränkung beschränkt wird. Im selben Bereich der virtuellen Maschine kann nur auf die einzige Instanz von Singleton über die GetInstance () -Methode zugegriffen werden. (Tatsächlich können Sie durch den Java -Reflexionsmechanismus eine Klasse mit einem privaten Konstrukt instanziieren, das im Grunde alle Java Singleton -Implementierungen ungültig macht. Dieses Problem wird hier nicht diskutiert, und ich werde denken, dass der Reflexionsmechanismus nicht existiert.)
Die obige Implementierung berücksichtigt jedoch keine Sicherheitsprobleme von Thread. Die Sicherheit von Thread bedeutet: Wenn sich Ihr Code in einem Prozess befindet, in dem mehrere Threads gleichzeitig ausgeführt werden und diese Threads diesen Code gleichzeitig ausführen können. Wenn das Ergebnis jedes Laufs dem Ergebnis eines einzelnen Thread-Laufs übereinstimmt und die Werte anderer Variablen übereinstimmen, ist es mit Thread-Safe. Mit anderen Worten: Die Schnittstelle, die von einer Klasse oder einem Programm bereitgestellt wird, ist ein Atomoperation für einen Thread, oder das Wechsel zwischen mehreren Threads führt nicht zu Unklarheiten für das Ausführungsergebnis der Schnittstelle, dh wir müssen das Problem der Synchronisierung nicht berücksichtigen. Offensichtlich entspricht die obige Implementierung nicht die Sicherheitsanforderungen der Thread, und mehrere Singleton -Instanzen werden wahrscheinlich in einer gleichzeitigen Umgebung erscheinen.
public class teststream {privater Zeichenfolge Name; public String getName () {return name; } public void setName (String -Name) {this.name = name; } // Diese Klasse kann nur eine Instanz private teststream () {} // Private Nicht-Argument-Konstruktor // Diese Klasse muss von selbst erstellt werden // Es gibt 2 Wege/*Private statische endgültige Teststream ts = new teststream ();*/private statische teststream ts1 = null; // Diese Klasse muss dieses Instanzobjekt automatisch dem gesamten System public static teststream GetTest () {if (ts1 == null) {ts1 = new Teststream () bereitstellen; } return ts1; } public void getInfo () {System.out.println ("Ausgabenachricht"+Name); }} public class testmain {public static void main (String [] args) {teststream s = teststream.gettest (); S.SetName ("Zhang Xiaoxiang"); System.out.println (S.GetName ()); Teststream s1 = teststream.gettest (); S1.SetName ("Zhang Xiaoxiang"); System.out.println (s1.getName ()); S.GetInfo (); s1.getInfo (); if (s == S1) {System.out.println ("Die gleiche Instanz wurde erstellt"); } else if (s! = s1) {System.out.println ("nicht die gleiche Instanz erstellt"); } else {System.out.println ("Anwendungsfehler"); }}}}Auslaufergebnisse:
Zhang Xiaoxiang Zhang Xiaoxiang
Ausgabenachricht Zhang Xiaoxiang
Ausgabenachricht Zhang Xiaoxiang erstellte die gleiche Instanz
Schlussfolgerung: Aus den Ergebnissen können wir sehen, dass das Singleton-Muster eine objektorientierte Anwendung mit dem eindeutigen Zugriffspunkt für ein Objekt liefert. Unabhängig davon, welche Funktion sie ausführt, wird die gesamte Anwendung ein Instanzobjekt weitergeben.
1. Hungriger Singleton
// hungrige Singleton -Klasse. Bei der Klasseninitialisierung wurde die öffentliche Klasse Singleton1 selbst instanziiert. // statische Fabrikmethode public static Singleton1 getInstance () {return Single; }} 2. Lazy Singleton -Klasse
// Laggy Singleton -Klasse. Instanzielle öffentliche Klasse Singleton2, wenn er zum ersten Mal öffentliche Klasse Singleton2 {// Private Standard Constructor Private Singleton2 () {} // Beachten, dass es keine endgültige private statische Singleton2 Single = Null gibt; // statische Fabrikmethode öffentliche synchronisierte statische Singleton2 getInstance () {if (Single == null) {Single = new Singleton2 (); } return Single; }} 3. registrierte Singleton -Klasse
import Java.util.hashMap; import Java.util.map; // registrierte Singleton -Klasse. // Ähnlich der Methode im Frühjahr registrieren Sie den Klassennamen und erhalten Sie ihn das nächste Mal direkt von ihm. öffentliche Klasse Singleton3 {private statische Karte <String, Singleton3> map = new Hashmap <String, Singleton3> (); static {Singleton3 Single = new Singleton3 (); map.put (Single.getClass (). getName (), Single); } // Die geschützte Standardkonstruktor -geschützte Singleton3 () {} // statische Fabrikmethode gibt die eindeutige Instanz dieser Klasse public static Singleton3 getInstance (String name) {if (name == null) {name = Singleton3.class.getname () zurück; System.out.println ("name == null"+"---> name ="+name); } if (map.get (name) == null) {try {map.put (name, (Singleton3) class.forname (name) .NewInstance ()); } catch (InstantiationException e) {e.printstacktrace (); } catch (illegalAccessException e) {e.printstacktrace (); } catch (classNotFoundException e) {e.printstacktrace (); }} return map.get (name); } // Eine schematische kommerzielle Methode öffentliche Zeichenfolge über () {return "Hallo, ich bin RegSingleton."; } public static void main (String [] args) {Singleton3 Single3 = Singleton3.getInstance (null); System.out.println (Single3.about ()); }} Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.