English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Komplette Analyse des Singleton-Patterns in Java-Designmustern

Dieser Artikel teilt den spezifischen Code des Singleton-Patterns aus dem Java-Design-Pattern mit, zur Referenz für alle, und der Inhalt ist wie folgt

Konzept:

Singleton-Pattern: Eine Klasse hat nur eine Instanz.

Eine Klasse hat genau eine Instanz und bietet einen globalen Zugriffspunkt.

Die Ursachen für die Verwendung dieses Musters:

  Wenn wir Websites besuchen, zeigen einige Websites die "Aktuelle Anzahl der Online-Besucher" an. Der gewöhnliche Weg, diese Funktion zu realisieren, ist, jeden angemeldeten IP-Adresse in einem Speicher, einer Datei oder einer Datenbank zu speichern. Für jede zusätzliche IP-Adresse wird "+1. wird in der Regel durch eine Methode realisiert, z.B. add().+1. Funktion, wie z.B. mit dem "update"-Statement, die in der Datenbank gespeicherten Daten abrufen, und+1Aktualisierung der Daten in der Datenbank, und speichern; Wenn die Daten auf der Seite angezeigt werden, können die Daten aus der Datenbank durch eine andere Methode abgerufen werden. Wenn jedoch mehrere Benutzer gleichzeitig anmelden, und jeder ein neues Objekt erstellt, um das "add()"-Method durch "Objekt.MethodeName" aufzurufen und die Daten in die Datenbank zu speichern, führt dies dazu, dass mehrere Benutzer nicht sicherstellen können, dass die tatsächlichen Benutzerdaten korrekt in die Datenbank gespeichert werden. Daher wird dieser Zähler als globale Objekt gestaltet (jeder verwendet diesen Objekt, anstatt ein neues zu erstellen), sodass alle gemeinsam dieselben Daten verwenden und ähnliche Probleme vermieden werden können. Dies ist eine Anwendung des Singleton-Patterns. 

Gleichermaßen gibt es in anderen Szenarien ähnliche Situationen, in denen ähnliche Ansätze verwendet werden. Zum Beispiel:

   1. Externe Ressourcen: Jedes Computer hat mehrere Drucker, aber nur einen PrinterSpooler, um zu vermeiden, dass zwei Druckaufträge gleichzeitig auf den Drucker ausgeführt werden. Interne Ressourcen: Die meisten Software hat (oder mehrere) Eigenschaftsdateien, um die Systemkonfiguration zu speichern, und ein solches System sollte ein Objekt haben, das diese Eigenschaftsdateien verwaltet.
   2. Der Task Manager von Windows ist ein sehr typisches Beispiel für das Singleton-Pattern (klingt das vertraut?). Denken Sie daran, können Sie zwei Task Manager gleichzeitig öffnen? Probieren Sie es doch einfach aus, falls Sie nicht glauben!
   3. Der Recycle Bin (Papierkorb) von Windows ist ein typisches Beispiel für die Anwendung des Singleton-Patterns. Während des gesamten Betriebs der Systeme wird der Papierkorb immer nur eine einzige Instanz unterhalten.
   4. Der Zähler einer Website wird in der Regel auch mit dem Singleton-Pattern implementiert, da es sonst schwierig wäre, ihn zu synchronisieren.
   5. Die Protokollierung in Anwendungen wird in der Regel mit dem Singleton-Pattern implementiert, da die gemeinsame Logdatei ständig geöffnet ist und nur eine Instanz den Zugriff darauf haben kann, um sicherzustellen, dass der Inhalt korrekt hinzugefügt wird.
   6. Das Lesen von Konfigurationsobjekten in Web-Anwendungen wird in der Regel auch mit dem Singleton-Pattern umgesetzt, da die Konfigurationsdatei ein gemeinsam genutztes Ressource ist.
   7. Das Design eines Datenbankverbindungspools wird in der Regel auch mit dem Singleton-Pattern umgesetzt, da eine Datenbankverbindung eine Datenbankressource ist. Die Verwendung eines Datenbankverbindungspools in Datenbanksoftwaressystemen dient hauptsächlich dazu, die Effizienzverluste zu sparen, die durch das Öffnen oder Schließen von Datenbankverbindungen verursacht werden, da diese Verluste sehr kostspielig sind. Durch die Verwendung des Singleton-Patterns kann dieser Verlust erheblich reduziert werden.
   8. Das Design eines Threadpools in Multithreading wird in der Regel auch mit dem Singleton-Pattern umgesetzt, da es notwendig ist, die Threads im Pool bequem zu steuern.
   9. Das Dateisystem des Betriebssystems ist auch ein konkretes Beispiel für die Implementierung des Singleton-Patterns, da ein Betriebssystem nur ein Dateisystem haben kann.
   10. HttpApplication ist auch ein typisches Beispiel für den Singleton-Modus. Jeder, der das gesamte Anfragelebenzyklus von ASP.Net (IIS) kennt, sollte wissen, dass HttpApplication ebenfalls ein Singleton-Modus ist und alle HttpModule teilen eine HttpApplication-Instanz. 

Zusammenfassend gesagt, die allgemeine Anwendungsszenarien des Singleton-Patterns sind:

    1. Objekte, die häufig instanziert und zerstört werden müssen.

    2. Objekte, die viel Zeit oder Ressourcen beim Erstellen verbrauchen, aber häufig verwendet werden.

      3. Objekte von Werkzeugklassen mit Zustand.

    4. Objekte, die häufig auf Datenbanken oder Dateien zugreifen.

    5. Beim Teilen von Ressourcen wird vermieden, dass Leistung oder Verlust durch die Operationen der Ressourcen verursacht werden. Zum Beispiel Protokolldateien, Anwendungsconfigurationen.

    6. Es ist einfach, Ressourcen zu kontrollieren und die Kommunikation zwischen Ressourcen zu ermöglichen. Zum Beispiel Threadpools.

Merkmale:

1、Die Singleton-Klasse kann nur eine Instanz haben;

2、Die Singleton-Klasse muss ihre eigene einzigartige Instanz selbst erstellen;

3、Die Singleton-Klasse muss diesem Beispiel für alle anderen Objekte zur Verfügung stellen

Elemente des Singleton-Patterns: 

   1. Private Konstruktor
   2. Private statische Referenz auf die eigene Instanz
   3. Öffentliche statische Methode, die ihre eigene Instanz als Rückgabewert hat 

Drei Methoden zur Implementierung des Singleton-Patterns:

1. Einfaches Essen: Der Singleton-Instanz wird bei der Klassenladung erstellt und sofort initialisiert (vorausschauende Ladenmethode).

/**
* Einfaches Essen (empfohlen)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

Vorteile 

    1. Thread-sicher
    2. Ein statisches Objekt wird bereits bei der Klassenladung erstellt, und die Reaktionsgeschwindigkeit beim Aufruf ist schnell

Nachteile 

    Die Ressourceneffizienz ist nicht hoch, möglicherweise wird getInstance() niemals ausgeführt, aber andere statische Methoden der Klasse oder das Laden der Klasse (class.forName) führen dazu, dass die Instanz immer noch initialisiert wird

2. Der Läufermodus: Der Singleton-Instanz wird beim ersten Einsatz erstellt und verzögert initialisiert.

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //Wenn mehrere Threads gleichzeitig instance als null bewerten, tritt bei der Ausführung der new-Operation eine Dublette auf
            instance = new Singleton2()
        }
        return instance;
    }
}

Vorteile 

    Er vermeidet das Problem, dass der Hungry-Modus ohne Verwendung von Beispielen erstellt wird, die Ressourcennutzung ist hoch, und es wird nicht instanziert, wenn getInstance() nicht ausgeführt wird, sondern andere statische Methoden der Klasse können ausgeführt werden.

Nachteile 

    Der Läufermodus funktioniert in einer einzigen Thread ohne Probleme, aber wenn mehrere Threads gleichzeitig auf die gleiche Zeit zugreifen, können mehrere Instanzen gleichzeitig erstellt werden, und diese Instanzen sind nicht dasselbe Objekt. Obwohl die später erstellten Instanzen die ersten Instanzen überschreiben, kann es immer noch vorkommen, dass verschiedene Objekte erworben werden. Die Lösung dieses Problems ist das Hinzufügen von Locks (synchronized), der erste Ladeprozess ist nicht schnell genug, und der zusätzliche Synchronisationsaufwand der Multithreading ist groß.

3.doppelte Überprüfung

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

Vorteile 

    Hohe Ressourcennutzung, ohne getInstance() wird nicht instanziert, andere statische Methoden dieser Klasse können ausgeführt werden

Nachteile 

    Die Reaktion ist beim ersten Laden nicht schnell genug, da aufgrund einiger Gründe des Java-Memory-Modells gelegentlich fehlschlägt

4.statische Innere Klasse

class Test {
    private Test() {
    }
    private static class SingletonHelp {
        static Test instance = new Test();
    }
    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

Vorteile 

    Hohe Ressourcennutzung, ohne getInstance() wird nicht instanziert, andere statische Methoden dieser Klasse können ausgeführt werden

Nachteile 

    Die Reaktion ist beim ersten Laden nicht schnell genug

Zusammenfassung: 

    Es wird in der Regel das Hungry-Mode verwendet, und wenn die Ressourcen sehr wichtig sind, kann das statische Innere Klasse verwendet werden. Es wird nicht empfohlen, den Lazy-Mode und das Double-Check zu verwenden.

 Das ist der gesamte Inhalt dieses Artikels. Ich hoffe, er hilft Ihnen bei Ihrem Lernen und ich hoffe, dass Sie die Anleitung von呐喊 unterstützten.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Sobald die Beschwerde bestätigt wird, wird diese Website den fraglichen Inhalt sofort löschen, der urheberrechtlich geschützt ist.)

Vermutlich mögen Sie