Singleton -Modus
Motivation ist manchmal wichtig, nur eine Instanz der Klasse zu haben. Beispielsweise sollte ein System nur eine Fensterverwaltungsinstanz haben.
Das Singleton -Muster ist das einfachste Designmuster: Die Klasse ist dafür verantwortlich, sich selbst zu instanziieren, sicherzustellen, dass es nur eine Instanz gibt, und einen Eintrag für den Zugriff auf diese Instanz bereitzustellen.
Zweck
1. Stellen Sie sicher, dass nur eine Instanz erstellt wird.
2. Geben Sie einen Eintrag zur Verfügung, um auf diese Instanz zuzugreifen.
Verwenden Sie das Finale, um sicherzustellen, dass es einmal erstellt wird, und der private Konstruktor stellt sicher, dass er nicht instanziiert wird. Die GetInstance -Methode der Öffentlichkeit stellt sicher, dass externer Zugang möglich ist. Das Folgende ist der hungrige Modus:
öffentliche Klasse Singleton {private statische Final Singleton Instance = new Singleton (); private Singleton () {} public static Singleton getInstance () {return Instance; }}
Fauler Modus:
öffentliche Klasse Singletondemo {private statische volatile Singletondemo -Instanz = null; private Singletondemo () {} public static SingletonDemo getInstance () {if (Instance == null) {synchronized (SingletonDemo .class) {if (instance == null) {Instance = new SingletonDemo (); }} return Instance; }}
Anwendbare Szenarien und Beispiele
1. Die Logger -Klasse verhindert jedes Mal, wenn das Protokoll gedruckt wird, die Erstellung einer Logger -Instanz.
2. Kontrollklasse, im Allgemeinen gibt es im gesamten System nur eine Steuerinstanz.
Spezifische Probleme und Implementierungen
1. Thread-Safe, robuster Singleton-Modus sollte thread-safe sein.
2. Lazy Modus verwendet einen Doppelsperrmechanismus.
3. Der Eagle -Modus verwendet statische Variablen und wird so instanziiert, dass das Programm geladen wird, um sicherzustellen, dass nur eine Instanz vorhanden ist.
4. Die abstrakten Fabrik- und Fabrikmethoden werden normalerweise als Singleton -Muster konzipiert, um sicherzustellen, dass nur eine Fabrik vorhanden ist.
5. Bei Verwendung von Serialisierung und Deserialisierung werden mehrere Instanzen erstellt. Verwenden Sie die ReadResolve -Funktion, um dies zu vermeiden, aber es ist am besten, keine Serialisierung zu verwenden.
Die öffentliche Klasse Singleton implementiert serialisierbare {... // Diese Methode wird unmittelbar nach einem Objekt dieser Klasse aufgerufen. // Diese Methode gibt die Singleton -Instanz zurück. geschütztes Objekt readResolve () {return getInstance (); }}
Schlüsselpunkte
1. Achten Sie in Multi-Thread-Programmen auf die Datensynchronisation.
2. Verwenden Sie beim Serialisieren die ReadResolve -Methode, um die Instanz zurückzugeben, um zu vermeiden, dass mehrere Objekte erstellt werden.
3. Wenn Sie von mehreren Klassenladern geladen werden, werden mehrere Instanzen erstellt.
Einfacher Werksmodus
Das einfache Fabrikmodell der Motivation ist die Grundlage und vorläufige Implementierung abstrakter Fabrik- und Fabrikmethoden.
Zweck
1. Geben Sie die Details der Objekt -Instanziierung nicht an den Kunden an.
2. Erstellen Sie ein Objekt über eine gemeinsame Schnittstelle.
erreichen
Die Implementierung ist sehr einfach:
1. Wenn ein Kunde Produkt benötigt, verwendet er nicht neu, um es zu erstellen, sondern eine Produktbeschreibung für die Fabrik, sodass die Fabrik ein neues Produkt bereitstellen kann.
2. Factory instanziiert ein Produkt an den Kunden.
3. Client verwendet abstraktes Produkt, ohne sich um die konkrete Implementierung des Produkts zu kümmern.
Beispiel
1. Zeichnenprogramm zum Zeichnen von Formen. Die Form ist die Produktschnittstelle und die Dreiecke sind das konkrete Produkt. Wir können eine Fabrik erstellen und dann das Produkt gemäß der Beschreibung des Kunden erstellen. Beim Hinzufügen neuer Formen müssen wir jedoch die Fabrikklasse ändern.
Spezifische Probleme und Implementierungen
1. Beim Hinzufügen neuer Produkte muss die Fabrik geändert werden.
public class ProductFactory {public Product CreateProduct (String ProductID) {if (id == id1) Return New OneProduct (); if (id == id2) geben neu ein weiteres Produkt zurück (); ... // so weiter für die anderen IDs return null; // Wenn die ID keinen der erwarteten Werte hat} ...}Im Allgemeinen verwenden wir die IF -Erklärung, um die Produktbeschreibung zu beurteilen und verschiedene Produkte zu instanziieren. Wenn es neue Produkte gibt, müssen wir neue Urteile hinzufügen. Dieses Problem kann durch abstrakte Fabrikmuster gelöst werden.
Zusammenfassen
1. Verwenden Sie es nur, wenn Sie den Werksmodus wirklich benötigen, andernfalls erhöht er nur die Komplexität des Programms. Wenn beispielsweise mehrere Objekte ähnliche Grundtypen haben, können Sie den einfachen Werksmodus verwenden, um Objekte einheitlich zu erstellen.
2. Einfache Fabriken haben mehr Beurteilungszweiganweisungen, die gegen das Prinzip der Öffnung und Schließung von Modifikationen verstoßen. Daher ist es ratsam, den einfachen Werksmodus für einige feste und einfache Programme zu verwenden und den abstrakten Werksmodus oder den Factory -Methodenmodus für einige komplexe und häufig erweiterte Programme zu verwenden.