Definition: Stellen Sie sicher, dass eine Klasse nur eine Instanz hat und sie selbst instanziiert und diese Instanz für das gesamte System zur Verfügung stellt.
Typ: Erstellen Sie Klassenmusterklassendiagramm:
Klassendiagramm Wissenspunkte:
1. Klassendiagramme sind in drei Teile unterteilt, Namen, Attribute und Methoden.
2. Kommentarinformationen beginnend mit << und enden mit >>
3. Modifikator + repräsentiert öffentlich, - repräsentiert private, # repräsentiert geschützt, nichts repräsentiert das sichtbare Paket.
4. Unterstrichene Attribute oder Methoden repräsentieren statisch.
5. Freunde, die mit der Beziehung zwischen Objekten im Klassendiagramm nicht vertraut sind, können sich auf den Artikel beziehen: Die Beziehung zwischen Klassen im Designmuster.
Der Singleton -Modus sollte der einfachste Modus unter den 23 Designmodi sein. Es hat die folgenden Elemente:
Schauen wir uns ein einfaches Beispiel an:
Paket com.wolf.Action; import Java.util.hashMap; Import Java.util.map; Public Class Demo {public static void main (String args []) wirft die Instanziationsexception aus, illegalaccessException, classnotfoundException {System.println (Son.GetinStance (). Getname (). System.out.println ("Wer bin ich"); }} Klasse Son erweitert Vater {private String name = "Son"; endgültige String class = "Demo"; Protected String getName () {return this.query ("aaa"); } public static Sohn GetInstance () löscht Instanziationsexception, illegalAccessexception, classNotFoundException {// Dies muss ein globaler Weg sein, ansonsten (Sohn) Instanz ("com.wolf.action.son"); }} class father {private statische Karte <String, Object> Instance = new HashMap <String, Object> (); private String name = "Premium Class"; protected void fatcher () {System.out.println ("Ich bin die übergeordnete Klasse"); } Protected String Query (String SQL) {return SQL + "wurde fertig"; } public statische Objektinstanz (String Objname) löscht die Instanziationxzeption, illegalAccessexception, classNotFoundException {if (instance.get (objname) == null ||! (Instance.get (objname) Instanz des Vaters) {Instance.put (objname, klassifizieren. } return Instance.get (objname); }} Das Singleton -Muster ist gemäß dem Zeitpunkt der Instanziierung des Objekts in zwei Typen unterteilt: Einer ist der hungrige Singleton und der andere ist der faule Singleton. Wenn die Singleton -Klasse geladen ist, instanziiert das Singleton ein Objekt zu seiner eigenen Referenz; Der faule Stil instanziiert das Objekt nur, wenn die Instanzmethode aufgerufen wird. Der Code ist wie folgt:
Hungriger Einzelfall im Man-Stil
öffentliche Klasse Singleton {private statische Singleton Singleton = new Singleton (); private Singleton () {} public static singleton getInstance () {return Singleton; }}Lazy Single Case
öffentliche Klasse Singleton {private statische Singleton Singleton; private Singleton () {} public static synchronisierte Singleton getInstance () {if (Singleton == null) {Singleton = new Singleton (); } return Singleton; }}Vorteile des Singleton -Modus:
Anwendbare Szenarien: Aufgrund der oben genannten Vorteile des Singleton -Modus ist es ein Entwurfsmodus, der häufiger bei der Programmierung verwendet wird. Ich habe zusammengefasst, was ich von geeigneten Szenarien für die Verwendung von Singleton -Modus weiß:
Anmerkungen zum Singleton -Modus:
Einige Kontroversen über Singleton -Muster in Java:
Wenn ein Objekt im Singleton -Modus lange Zeit nicht verwendet wird, wird es vom JVM -Müllsammler gesammelt? Ich habe viele Informationen gesehen: Wenn ein Singleton -Objekt lange Zeit nicht im Gedächtnis verwendet wird, wird es von JVM als Müll angesehen und wird bei der Durchführung von Müllsammlung gereinigt. Ich bin skeptisch gegenüber dieser Aussage. Meine eigene Ansicht ist: In der Hotspot Virtual Machine Version 1.6 recycelt der JVM -Garbage -Sammler keine Singleton -Objekte, es sei denn, die Verbindung, die auf Singleton -Objekte im Singleton referenziert, ist künstlich getrennt.
In Bezug auf diese Kontroverse schrieb der Autor einen separaten Artikel, um ihn zu diskutieren. Wenn Sie unterschiedliche Meinungen haben oder dies erlebt haben, besuchen Sie bitte den Artikel Singleton Model Diskussion: Singleton -Modell und Müllsammlung nehmen an der Diskussion teil.
Wird mehrere Singletons in einem JVM erscheinen?
Bei verteilten Systemen werden mehrere Klassenlader und serialisierte, mehrere Singletonen erzeugt, was zweifellos wahr ist. Wird ein Singleton im selben JVM erzeugt? Nur das gleiche Singleton kann unter Verwendung der vom Singleton bereitgestellten GetInstance () -Methode erhalten werden, sofern die Reflexionsmethode verwendet wird, wird ein neues Singleton erhalten. Der Code ist wie folgt
Klasse c = class.Forname (Singleton.class.getName ()); Konstruktor ct = C.GetDeclaredConstructor (); ct.setAccessible (true); Singleton Singleton = (Singleton) ct.newinstance ();
Auf diese Weise produziert jeder Lauf ein neues Singleton -Objekt. Achten Sie bei der Verwendung des Singleton -Modus daher darauf, dass Sie keine Reflexion verwenden, um neue Singleton -Objekte zu erzeugen.
Ist fauler Singleton -Thread sicher?
Es sind hauptsächlich einige Online-Aussagen, dass das faule Singleton-Muster Thread-Curse ist. Selbst das Hinzufügen des synchronisierten Schlüsselworts zur Instanziierungsmethode ist immer noch gefährlich. Nach der Codierung von Tests stellte ich jedoch fest, dass nach dem Hinzufügen des synchronisierten Schlüsselworts zum Ändern des Synchron-Keywords, obwohl es einen teilweise Einfluss auf die Leistung hat, aber mehrere Objekte so instanziiert, dass es thread-sicher ist.
Gibt es nur zwei Arten von Singleton -Modi: hungrige und faule Stile?
Hungry Singleton und Lazy Singleton sind nur zwei relativ Mainstream- und häufig verwendete Singleton -Mustermethoden. Theoretisch kann jedes Designmuster, das nur eine Instanz einer Klasse implementieren kann, als Singleton -Muster bezeichnet werden.
Können Singleton -Klassen vererbt werden?
Da die Baumethode privat ist, sind sie nicht vererbt, aber viele andere Singleton -Muster können vererbt werden, wie z. B. registrierte Singletons.
Ist es besser, ein hungriger Singleton oder ein fauler Singleton zu sein
In Java ist der hungrige Singleton besser als der faule Singleton. In C ++ werden im Allgemeinen faule Singletons verwendet.
Das Singleton -Muster ist relativ einfach, daher werde ich hier keine Beispielcode -Demonstration geben.