Das Singleton -Modell ist das einfachste Designmodell unter den 23 Designmodellen und wird auch in der Enterprise -Entwicklung häufig verwendet. Der Vorteil des Singleton -Musters besteht darin, dass das Projekt nur eine Instanz gibt.
Merkmale: Der Konstruktor ist privatisiert, das Objekt ist privatisiert und bietet nur eine externe Zugriffsoberfläche.
Anwendungsszenarien:
1. Das System muss Ressourcen teilen: wie Protokollsystem, Spring Resource Manager usw.
2. Um die Verwendung von Ressourcen zu steuern: wie Threadpool
Gemeinsame Anwendungen in der Entwicklung auf Unternehmensebene und gemeinsamen Rahmenbedingungen:
Servlets in J2EE, Ressourcenmanager im Frühjahr (d. H. Beans), Datenbankverbindungspools, Threadpools, Protokollsysteme, Website -Zähler usw.
Singleton -Musterklassifizierung:
1. Hungriger Modus: Der Hungry -Modus ist der einfachste Singleton -Modus für Code, aber die Instanz wird geladen, wenn die Klasse initialisiert wird. Wenn es nicht sofort verwendet wird, wird das System geladen. Der spezifische Code lautet wie folgt:
öffentliche Klasse Singleton {private statische Singleton Instance = new Singleton (); private Singleton () {} public static Singleton getInstance () {return Instance; }}2. Lazy -Modus: Im Vergleich zum Hungry -Modus wird der faule Modus instanziiert und in der einzigen externen Schnittstelle zum Verfahren platziert, wodurch verzögerte Lade- und Systeminitialisierungszeit sparen, aber es gibt eine Situation, in der Threads unsicher sind.
öffentliche Klasse Singleton {private statische Singleton Instance = null; private singleton () {} public static singleton getInstance () {if (instance == null) {return New Singleton (); } return Instance; }}3. Double Check Sperle: Der Double Check-Sperrmodus ist tatsächlich ein Upgrade des faulen Modus, wodurch der faule Thread-safe des Faulenmodus ist. HINWEIS: Mit der Double Check -Sperre gibt es ein Speicherproblem, das die Doppelprüfsperrung ungültig machen kann.
öffentliche Klasse Singleton {private statische Singleton Instance = null; private Singleton () {} public static Singleton getInstance () {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {return New Singleton (); }} return Instance; }}4. Statische interne Klassenmodus: Die statische interne Klasse hat sowohl faule als auch böse Modi: Thread-safe, verzögerte Belastung.
öffentliche Klasse Singleton {private statische Klasse SingletonFactory {private statische Singleton Instance = new Singleton (); } private Singleton () {} public static Singleton getInstance () {return SingletonFactory.instance; }}5. Aufzählungsklassenmodus: Es sollte der perfekteste Einzelinteressen-Modus sein, der nicht nur fadensicher ist, sondern auch Probleme mit Abläufen und Reflexion verhindert.
Enum Singleton {Instance; public void dosomething () {...}}Singleton -Musterdetails Problem:
1. Reflection bricht den Singleton -Modus: Reflexion kann die Implementierung des Singleton -Modus zerstören (mit Ausnahme des Aufzählungsmodus)
/***Zerstöre Singleton -Modus nach Reflexion*/Public Class Demo01 {public static void main (String [] args) löst eine Ausnahme aus {Singleton S1 = Singleton.getInstance (); Singleton S2 = Singleton.getInstance (); System.out.println (S1 == S2); Klasse <Singleton> clazz = (Klasse <Singleton>) class.forname ("com.singleton.singleton"); Konstruktor <Singleton> constructor = clazz.getDeclaredConstructor (NULL); constructor.setAccessible (true); Singleton S3 = Konstruktor.Newinstance (); System.out.println (S1 == S3); }} Klasse Singleton {private static Singleton Instance = new Singleton (); private Singleton () {// Methode, um zu verhindern, dass Reflexion den einzel-interess-Modus zerstört, öffnen Sie den Kommentarbereich // if (Instanz! }}Tatsächlich bedeutet die sogenannte Prävention, dass es unmöglich ist, durch Reflexion zu erzeugen.
2. Deserialisierung bricht das Singleton -Muster (mit Ausnahme des Aufzählungsklassenmusters)
/*** Deserialisierung bricht das Singleton -Muster*/Public Class Demo02 {public static void main (String [] args) Ausnahme {Singleton S1 = Singleton.getInstance (); Singleton S2 = Singleton.getInstance (); System.out.println (S1 == S2); FileOutputStream fos = new FileOutputStream ("d: //test.txt"); ObjectOutputStream OOS = New ObjectOutputStream (FOS); OOS.WriteObject (S1); OOS.CLOSE (); fos.close (); ObjectInputStream ois = new ObjectInputStream (neuer FileInputStream ("d: //test.txt")); Singleton S3 = (Singleton) ois.readObject (); System.out.println (S1 == S3); }} Klasse Singleton implementiert serialisierbar {private static Singleton Instance = new Singleton (); public static singleton getInstance () {return Instance; } // Standarddeserialisierung, wenn das Objekt bereits vorhanden ist, wird diese Methode // private Object ReadResolve () ObjectStreamException {// return Instance; // //}} ausgelöstDiese beiden Situationen beschränken sich auf das Verständnis und werden im tatsächlichen Entwicklungsprozess nicht viel verwendet.
Zu diesem Zeitpunkt ist das Singleton -Muster vollständig.
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.