Vorwort
Hallo zusammen, ich bin sehr schlau. Ein Entwurfsmuster ist eine Reihe von Code-Entwurfserfahrungen, die wiederholt verwendet wurden, den meisten Menschen bekannt sind und klassifiziert und katalogisiert sind. Der Zweck der Verwendung von Entwurfsmustern besteht darin, Code wiederzuverwenden, ihn für andere verständlicher zu machen und die Zuverlässigkeit des Codes sicherzustellen.
Heute werde ich einige relevante Wissenspunkte zum Singleton-Muster teilen und hoffe, dass es für Sie hilfreich ist.
Definition des Singleton-Musters
Das Singleton-Muster ist ein häufig verwendetes Muster für den kreativen Entwurf, dessen Kernstruktur nur eine spezielle Klasse namens Singleton enthält. Das Singleton-Muster kann sicherstellen, dass es im System nur eine Objektinstanz für eine Klasse gibt, die das Singleton-Muster verwendet.
Eigenschaften des Singleton-Musters
- Eine Singleton-Klasse kann nur eine Instanz haben.
- Eine Singleton-Klasse muss ihre eigene eindeutige Instanz erstellen.
- Eine Singleton-Klasse muss diese Instanz allen anderen Objekten bereitstellen
Hungriger chinesischer Stil
Das Merkmal von Hungry Style besteht darin, dass die Objektinstanz bereits während der Initialisierung erstellt wird, unabhängig davon, ob Sie sie verwendet haben oder nicht. Der spezifische Code lautet wie folgt:
public class HungrySingleton {
// 持有自己类的引用
private static final HungrySingleton singleton = new HungrySingleton();
// 私有化构造器
private HungrySingleton(){}
// 提供获取实例的静态方法
public static HungrySingleton getInstance(){
return singleton;
}
}
Vorteile: Keine Thread-Sicherheitsprobleme
Nachteile: Das Erstellen von Objekten während der Initialisierungsphase, vorausgesetzt, dass die Instanziierung des Objekts sehr zeitaufwändig ist und diese Instanz am Ende nicht verwendet wird, wäre das nicht eine Verschwendung von Ressourcen?
Fauler-Mann-Stil
Das Merkmal des Lazy-Stils besteht darin, dass das Objekt nur dann instanziiert wird, wenn es verwendet wird. Es ist relativ faul . Wenn es verwendet wird, prüft es, ob eine Instanz vorhanden ist. Wenn eine Instanz vorhanden ist, wird sie direkt zurückgegeben. Wenn Wenn nicht, wird es erstellt und dann zurückgegeben. Der spezifische Code lautet wie folgt:
public class LazySingleton {
private static LazySingleton singleton;
// 私有化构造器
private LazySingleton(){}
// 提供获取实例的静态方法
public static LazySingleton getInstance(){
// 若对象没有被实例化,则new一下再返回
if (singleton == null) {
singleton = new LazySingleton();
}
return singleton;
}
}
Vorteile: Das Objekt wird nur dann instanziiert, wenn es verwendet wird
Nachteile: Das größte Problem bei dieser Implementierung besteht darin, dass sie nicht threadsicher ist. Da es keine Sperre gibt, können mehrere Objekte gleichzeitig instanziiert werden.
Doppelte Erkennungssperre
Wie der Name schon sagt, verwendet die Doppelerkennungssperre einen Sperrmechanismus mit doppelter Beurteilung , der sicher ist und in Multithread-Situationen eine hohe Leistung aufrechterhalten kann . Dies entspricht einer aktualisierten Version des Lazy-Stils. Der spezifische Code lautet wie folgt:
public class DoubleCheckLockingSingleton {
// 注意这里多了一个volatile关键字,面试的时候经常会问这个关键字的作用
private volatile static DoubleCheckLockingSingleton singleton;
// 私有化构造器
private DoubleCheckLockingSingleton(){}
// 提供获取实例的静态方法
public static DoubleCheckLockingSingleton getInstance(){
if (singleton == null) {
synchronized (DoubleCheckLockingSingleton.class) {
if (singleton == null) {
singleton = new DoubleCheckLockingSingleton();
}
}
}
return singleton;
}
}
Vorteile: Geeignet für den Einsatz in Situationen mit hoher Parallelität, Gewährleistung der Thread-Sicherheit
Nachteile: Singletons können durch Reflexion zerstört werden
statische innere Klasse
Wie der Name schon sagt, implementieren statische innere Klassen den Singleton-Modus über statische innere Klassen. Diese Methode kann den gleichen Effekt erzielen wie doppelte Erkennungssperren. Der spezifische Code lautet wie folgt:
public class StaticInnerClassSingleton {
// 静态内部类
private static class SingletonHolder {
private static final StaticInnerClassSingleton singleton = new StaticInnerClassSingleton();
}
// 私有化构造器
private StaticInnerClassSingleton(){}
// 提供获取实例的静态方法
public static StaticInnerClassSingleton getInstance() {
return SingletonHolder.singleton;
}
}
Vorteile: Thread-Sicherheit, Nutzung der Eigenschaften statischer innerer Klassen, um verzögertes Laden und hohe Effizienz zu erreichen
Nachteile: Singletons können durch Reflexion zerstört werden
aufzählen
In Java sind Aufzählungen natürliche Singletons . Jede Instanz hat nur ein Objekt. Dies ist eine Garantie, die durch den zugrunde liegenden internen Mechanismus von Java bereitgestellt wird.
public enum EnumSingleton {
INSTANCE;
}
Vorteile: JVM stellt sicher, dass die Aufzählung ein natürlicher Singleton ist, Thread-sicher, unterstützt automatisch den Serialisierungsmechanismus, verhindert, dass durch Deserialisierung neue Objekte neu erstellt werden, und verhindert mehrere Instanziierungen.
Zusammenfassen
Es gibt viele Möglichkeiten, den Singleton-Modus zu implementieren. Sie werden unter drei Gesichtspunkten verglichen: ob er threadsicher ist, ob er verzögert geladen wird und ob er die Reflexionskonstruktion verhindert, wie folgt:
Implementierung des Singleton-Musters | Ist es threadsicher? | Ob Lazy Load | Ob reflektierende Builds verhindert werden sollen |
---|---|---|---|
Hungriger chinesischer Stil | Ja | NEIN | NEIN |
Fauler-Mann-Stil | NEIN | Ja | NEIN |
Doppelte Erkennungssperre | Ja | Ja | NEIN |
statische innere Klasse | Ja | Ja | NEIN |
aufzählen | Ja | NEIN | Ja |
Das Singleton-Muster wird häufig bei Vorstellungsgesprächen und bei der Arbeit angetroffen. Welche Designmuster verwenden Sie häufig bei Ihrer Arbeit? Hinterlassen Sie gerne unten eine Nachricht.
Freunde, denen dieser Artikel gefällt, dann muss Ihnen dieser Artikel gefallen! Dann gib ihm ein Like!