Latest web development tutorials

Singleton Pattern

Singleton (Singleton Pattern) Java ist eine der einfachsten Design-Muster. Diese Art von Entwurfsmustern gehören Schema zu erstellen, die die beste Weg, um Objekte zu erstellen bietet.

Dieses Modell beinhaltet eine einzige Klasse, die für die Erstellung Ihrer eigenen Objekte zuständig ist, während sichergestellt wird, dass nur ein einzelnes Objekt erstellt wird. Diese Klasse bietet ein einzigartiges Objekt ihres Besuchs, es kann direkt zugegriffen werden, Sie brauchen nicht ein Objekt dieser Klasse instanziiert.

Hinweis:

  • 1, Singleton Klasse kann nur eine Instanz haben.
  • 2, Singletonklasse müssen ihre eigene eindeutige Instanz erstellen.
  • 3 muss Singletonklasse diesem Beispiel zu allen anderen Objekten zur Verfügung stellen.

Einführung

Absicht: dass nur eine Instanz einer Klasse zu gewährleisten und einen globalen Zugriffspunkt darauf zuzugreifen.

Die wichtigste Lösung: Verwenden Sie eine globale Klasse häufig erstellt und zerstört.

Wann verwendet man :Wenn Sie die Anzahl der Instanzen zu steuern möchten , wann, Systemressourcen zu sparen.

Wie zu lösen: Feststellen , ob das System bereits diesen einzigen Fall hat, wenn er zurückgeht , wenn nicht , dann erstellt.

Der Schlüsselcode: der Konstruktor ist privat.

Anwendungsbeispiele: 1, kann eine Partei nur einen Präsidenten.2, Windows ist ein Multi-Prozess, multi-threaded, in den Betrieb einer Datei, wenn sie zwangsläufig mehrere Prozesse oder Threads gleichzeitig ein Dokument des Phänomens, die Verarbeitung aller Dateien müssen durch eine eindeutige Instanz durchgeführt werden. 3 wird ein Teil der Geräte-Manager häufig als Einzelfallmodell entwickelt, wie beispielsweise ein Computer mit zwei Drucker in der Ausgabe bei Bedarf mit zwei Druckern zu behandeln nicht die gleiche Datei drucken kann.

Vorteile: 1, nur eine Instanz im Speicher, wodurch Speicher - Overhead, besonders häufig erstellen und zu zerstören Instanzen (wie School of Management Home Page - Cache).2, um mehrere Belegung von Ressourcen (wie zB Dateischreibvorgänge) zu vermeiden.

Nachteile: keine Schnittstelle, nicht erben, und einzelne Verantwortung Prinzip Konflikt sollte eine Klasse nur über die interne Logik betroffen sein, nicht auf der Außenseite , wie zB wie instanziiert.

Einsatzszenarien: 1, erfordert die Herstellung einer eindeutigen Seriennummer.2, WEB Zähler, nicht jede Datenbank in Riga einmal mit einem einzigen Fall zu aktualisieren gecached. 3, ein Objekt durch die Notwendigkeit einer übermäßigen Verbrauch von Ressourcen, wie beispielsweise I / O-Verbindung zu der Datenbank erstellt und so weiter.

Anmerkung: getInstance () Methode erfordert die Verwendung von Synchronisations synchronisiert Schloß (Singleton.class) mehrere Threads in die Ursache beispielsweise zu verhindern , ist mehrfach instantiiert.

Realisierung

Wir werden eineSingleKlasse erstellen.SingleKlasse verfügt über einen eigenen Konstruktor und eine statische Instanz.

Single- Klasse stellt eine statische Methode für außerhalb ihrer statischen Instanz zu erhalten.SingletonPatternDemo,unsere Demonstration KlassenSingle- KlasseSingleObjekt zu erhalten.

Singleton Muster UML-Diagramm

Schritt 1

Erstellen Sie eine Singleton-Klasse.

SingleObject.java

public class Single {

   // Erstellen Sie ein Objekt Single private static Single Instanz = new Single ();

   // Stellen Konstruktor privat, so dass die Klasse nicht privat Single instanziert werden () {}

   // Das einzige Objekt der Öffentlichkeit zur Verfügung statischen Single getInstance () Liefert {
      Rückkehr Instanz;
   }

   public void showmessage () {
      System.out.println ( "Hallo Welt!");
   }
}

Schritt 2

Erhalten Sie einzigartige Objekt aus Singletonklasse.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   public static void main (String [] args) {

      // Konstruktor // illegal Fehler bei der Kompilierung: Constructor Single () ist nicht sichtbar // Single Objekt = new Single ();

      // Das einzige Objekt verfügbar Single Objekt Get = SingleObject.getInstance ();

      // Displaymeldung object.showMessage ();
   }
}

Schritt 3

Stellen Sie sicher, ausgegeben.

Hallo Welt!

Mehrere Singleton Muster Implementierung

Umsetzung Singletonmuster eine Reihe von Möglichkeiten, wie folgt:

1, faul Stil, thread-safe

Sind faul Initialisierung: Ja

Sind Multi-Thread - sicher:Nein

Erreichen Sie Schwierigkeit:leicht

Beschreibung: Diese Methode ist die einfachste Möglichkeit , diese Umsetzung ist das größte Problem zu erreichen , ist nicht Multi-Threading unterstützen.Weil es keine Sperre synchronisiert, so strengen Sinne ist es nicht ein Singleton.
Lazy Loading auf diese Weise erfordert offensichtlich nicht Thread-Sicherheit, die Arbeit in einem multi-threaded funktioniert nicht.

Code - Beispiele:

public class Singleton {  
    private static Singleton Instanz;  
    Private Singleton () {}  
  
    public static Singleton getInstance () {  
    if (Beispiel == null) {  
        Beispiel = new Singleton ();  
    }  
    Rückkehr Instanz;  
    }  
}  

Die nächste Präsentation von mehreren Implementierungen unterstützen mehrere Threads, unterscheiden sich aber inderLeistung.

2, faul Stil, thread-safe

Sind faul Initialisierung: Ja

Sind Multi-Thread - sicher:Ja

Erreichen Sie Schwierigkeit:leicht

Beschreibung: auf diese Weise eine gute träges Laden haben, können in einem Multi-Thread gut arbeiten, jedoch sehr geringe Effizienz, 99% der Fälle erfordert keine Synchronisation.
Vorteil: Der erste Aufruf initialisiert wurde, um eine Verschwendung von Speicher zu vermeiden.
Nachteile: muss verriegelt werden, synchronisiert, um einen einzigen Fall zu gewährleisten, aber die Sperre wird die Effizienz beeinflussen.
getInstance () die Leistung der Anwendung ist nicht entscheidend (die weniger häufig verwenden).

Code - Beispiele:

public class Singleton {  
    private static Singleton Instanz;  
    Private Singleton () {}  
    public static synchronisiert Singleton getInstance () {  
    if (Beispiel == null) {  
        Beispiel = new Singleton ();  
    }  
    Rückkehr Instanz;  
    }  
} 

3, hungernde Formel

Sind Verzögerte Initialisierung: Nein

Sind Multi-Thread - sicher:Ja

Erreichen Sie Schwierigkeit:leicht

Beschreibung: Es ist häufiger, aber anfällig für Müll - Objekte.
Vorteile: nicht gesperrt ist, wird die Effizienz verbessert.
Nachteile: Class Loader initialisiert wird, Speicher verschwendet wird.
Es basiert auf classloder Mechanismus vermeidet Synchronisations Multithreading jedoch Instanz, wenn es Class Loader instanziiert wird, obwohl die Ursache Klasse eine Vielzahl von Gründen, die meisten der Singleton-Muster Laden ist die getInstance Methode zu nennen, aber es kann nicht bestimmt werden es gibt andere Wege (oder andere statische Methoden) führt zu einer Klasse Laden, offenbar diesmal nicht Instanz Initialisierung verzögertes Laden-Effekt erreichen.

Code - Beispiele:

public class Singleton {  
    private static Singleton Instanz = new Singleton ();  
    Private Singleton () {}  
    public static Singleton getInstance () {  
    Rückkehr Instanz;  
    }  
}  

4, überprüfen Sie lock / doppelten Kontrolle Sperre (DCL, das ist doppelt geprüft Verriegelung)

JDK - Version: jdk1.5aus

Sind faul Initialisierung: Ja

Sind Multi-Thread - sicher:Ja

Erkenne die Schwierigkeit: komplexere

Beschreibung: Diese Methode verwendet Doppelverriegelungsmechanismus, Sicherheit und, im Fall von Multi-Threading hoher Leistung zu erhalten.
getInstance () die Performance der Anwendungen ist entscheidend.

Code - Beispiele:

public class Singleton {  
    Private flüchtige statische Singleton Singleton;  
    Private Singleton () {}  
    public static Singleton getSingleton () {  
    if (Singleton == null) {  
        synchronisiert (Singleton.class) {  
        if (Singleton == null) {  
            Singleton = new Singleton ();  
        }  
        }  
    }  
    Rückkehr Singletons;  
    }  
}  

5, Registrierungsart / statische innere Klassen

Sind faul Initialisierung: Ja

Sind Multi-Thread - sicher:Ja

Erkenne die Schwierigkeit: Allgemeines

Beschreibung: Diese Methode kann die gleiche Wirkung double-check - Sperrmodus zu erreichen, aber die Implementierung einfacher.Verwenden Sie verzögerte Initialisierung von statischen Feld sollte, statt überprüfen Sie den Lock-Modus auf diese Weise verwendet werden. Dies gilt nur für den Fall eines statischen Feldes, überprüfen Sie den Lock-Modus verwendet wird, wenn Verzögerung benötigt werden kann, um beispielsweise Felder initialisieren.
Dieser Ansatz nutzt auch classloder Mechanismen dass die Initialisierung nur ein Thread-Instanz, um sicherzustellen, ist es mit 3 verschiedene Möglichkeiten ist: solange der dritte Weg Singleton Klasse geladen wird, wird die Instanz instanziiert (nicht erreicht verzögertes Laden Effekt), aber dieser Ansatz ist Singleton Klasse geladen wird, Instanz nicht initialisiert werden kann. Da SingletonHolder Klasse nicht aktiv verwendet wird, nur durch den Aufruf getInstance Methode angezeigt, erscheint SingletonHolder Klasse geladen, die Instanz instanziiert wird. Stellen Sie sich vor, wenn Sie beispielsweise ressourcenintensive instanziiert, so wollte es Laden zu verzögern, auf der anderen Seite, wenn Sie nicht wollen, Singleton Class Loader instanziiert, weil es nicht Singleton-Klasse auch in anderen Bereichen aktiv sein sicherstellen können, kann so sein, geladen, um diesmal Instanz eindeutig unangemessen instanziiert. Diese Zeit wird auf diese Weise im Vergleich zu den ersten drei Arten von Möglichkeiten, es ist sehr vernünftig.

Code - Beispiele:

public class Singleton {  
    private static Klasse SingletonHolder {  
    private static final Singleton INSTANZ = new Singleton ();  
    }  
    Private Singleton () {}  
    public final static Singleton getInstance () {  
    Rückkehr SingletonHolder.INSTANCE;  
    }  
}   

6, aufzuzählen

JDK - Version: jdk1.5aus

Sind Verzögerte Initialisierung: Nein

Sind Multi-Thread - sicher:Ja

Erreichen Sie Schwierigkeit:leicht

Beschreibung: Diese Implementierung ist noch nicht weithin angenommen worden, aber dies ist der beste Weg , Singletonmuster zu implementieren.Es ist präzise, ​​automatische Unterstützung Serialisierungsmechanismus mehrere Instanzen des absoluten zu verhindern.
Dieser Ansatz ist Effective Java Autor Josh Bloch einen Weg plädiert dafür, dass es nicht nur Multi-Thread-Synchronisationsprobleme vermeiden können, sondern unterstützt auch automatisch Serialisierungsmechanismus Deserialisierung neu erstellen ein neues Objekt, absolut verhindern Mehrfachinstanzierung zu verhindern. Da jedoch nur trat nach jdk1.5 Enum Eigenschaften auf diese Weise schreiben kann nicht helfen, aber seltsam, in der Praxis selten verwendet fühlen.
Nicht durch Reflexion Angriff auf den privaten Konstruktor aufzurufen.

Code - Beispiele:

public enum Singleton {  
    INSTANZ;  
    public void whateverMethod () {  
    }  
}  

Daumenregel: Unter normalen Umständen nicht empfohlen , die Verwendung des ersten Typs und des zweiten Typs faule Weise, ist es empfehlenswert , ein hungriger Mann dritten Weg zu verwenden.Nur wenn Sie ein träges Laden-Effekt ist klar implementieren möchten, werden wir die ersten fünf Arten von Möglichkeiten nutzen, um zu registrieren. Wenn es Objekte zu deserialisieren kommt zu erstellen, können Sie versuchen, den sechsten Aufzählungsmodus. Wenn Sie andere spezielle Bedürfnisse haben, können Sie eine vierte doppelte Überprüfung des Sperrmodus in Betracht ziehen.