Hallo zusammen, javaRush!
Heute erzähle ich Ihnen etwas über das Designmuster
Singleton
(einzeln).
Ziel: Erstellen Sie eine Klasse, die nur EIN Objekt hat. Dies bedeutet, dass unabhängig von der Häufigkeit des Zugriffs dasselbe Objekt zurückgegeben wird, das beim ersten Mal erstellt wurde. Das ist eine praktische Sache und vielerorts notwendig, nicht umsonst wird es in Frameworks implementiert.
Anwendung:
- Beispielsweise müssen Sie eine Datenbank mit einem Projekt und einer Klasse verbinden, die für die Verbindung damit verantwortlich ist. Die Verbindung wird einmal hergestellt und muss nicht immer wieder hergestellt werden
Application settings
– eine Klasse, die für die Verbindungseinstellungen verantwortlich ist, die für die Anwendung benötigt werden: Datenbankhost und -port usw. Sie werden einmal erstellt und während des gesamten Betriebs der Anwendung verwendet.
- Es gibt noch viele weitere Beispiele, die ich nicht erwähnt habe, also schreiben Sie Ihre Optionen in die Kommentare! =)
Nach dieser Einführung können wir, so wie ich es verstehe, ein Beispiel dieser Klasse zeigen: (Obwohl ich sicher bin, dass jeder von uns eine Implementierung davon finden kann) Hier ist das einfachste Beispiel, wenn wir den Konstruktor privat machen, d. h. Sie können ein Objekt nicht explizit erstellen. Und es gibt eine statische Methode
getInstance()
, die ein Objekt bereitstellt.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Es gibt Probleme mit Multithreading und dann können Sie eine
getInstance()
Markierungsmethode einfügen
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Abschließend möchte ich wie immer sagen: Wenn Sie anders denken oder einen Fehler in mir finden, schreiben Sie es in die Kommentare! Wir werden alles gerne besprechen :) Wenn Ihnen der Artikel gefallen hat, schreiben Sie „+“ und ich werde es wissen. Das ist mir wichtig :) PS: Ich füge weitere Implementierungen hinzu: Laut
Joshua Bloch ist dies der beste Weg, die Vorlage zu implementieren
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
Und weiter
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
Verzögerte Initialisierung
+
Hohe Leistung
-
Kann nicht für nicht statische Klassenfelder verwendet werden. Fragen/Anregungen – schreiben Sie in die Kommentare!
Siehe auch meine anderen Artikel:
GO TO FULL VERSION