Technologieaustausch

Implementierung des Singleton-Musters

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Einleitung

1.1 Hintergrund

Wenn eine Anwendung die Ressourcenfreigabe steuern, Konfigurationsverwaltung durchführen und Aufzeichnungsvorgänge protokollieren muss, besteht eine häufige Anforderung darin, einen globalen Zugriffspunkt zu verwenden, damit das Programm über diesen globalen Zugriffspunkt darauf zugreifen kann, unabhängig davon, wo es sich befindet relevante Instanzinformationen. Um diesen Bedarf zu decken, können wir das Singleton-Muster verwenden. Das Singleton-Muster stellt sicher, dass eine Klasse nur eine Instanz hat und stellt einen globalen Zugriffspunkt für den Zugriff auf diese Instanz bereit.

Insbesondere stellt das Singleton-Muster normalerweise eine statische Methode (z. B. getInstance()) bereit, die die einzige Instanz der Klasse zurückgibt. Da diese Methode statisch ist, kann sie aufgerufen werden, ohne eine Instanz der Klasse zu erstellen. Dies bedeutet, dass jeder Code, der Zugriff auf die Klasse hat, durch Aufrufen dieser statischen Methode eine Singleton-Instanz erhalten kann.

1.2 Zweck

In diesem Artikel werden die grundlegenden Konzepte und Implementierungsschritte des Singleton-Musters ausführlich vorgestellt. Durch diesen Artikel werden Sie in der Lage sein, die Funktionsweise des Singleton-Musters zu verstehen und zu erfahren, wie Sie es effektiv in realen Projekten einsetzen können.

2. Was ist das Singleton-Muster?

Um ein interessantes Beispiel zu nennen: Das Singleton-Modell ist wie der Heiligenschein des Protagonisten in einer Anime-Welt. Egal wie sich die Handlung entwickelt, es gibt immer nur einen Protagonisten, und jeder weiß, dass er der Kern der Geschichte ist. Auf diese Weise kann jeder die gleiche Person finden, die die Handlung vorantreibt, ganz gleich, wie sich die Geschichte entwickelt.

2.1 Vor- und Nachteile des Singleton-Musters

Vorteil

Stellen Sie sicher, dass es sich um eine einzelne Instanz handelt: Vermeiden Sie die doppelte Erstellung von Instanzen und sparen Sie Ressourcen.
globaler Zugangspunkt: Bequemer globaler Zugriff und vereinfachtes Telefonieren.
Verzögerte Initialisierung: Erstellen Sie Instanzen nach Bedarf, um die Leistung zu verbessern.

Mangel

Schwierig zu skalieren: Singleton-Klassen sind oft schwierig zu erweitern, da der Konstruktor privat ist.
potenzielle Leistungsprobleme: In einer Umgebung mit hoher Parallelität können bei einigen Implementierungen Leistungsprobleme auftreten.
Schwierigkeiten beim Testen: Das Singleton-Muster kann das Testen erschweren, da es sich um einen globalen Status handelt.

2.2 Nutzungsszenarien des Singleton-Modus

Entsprechend den Merkmalen des Singleton-Musters können seine Verwendungsszenarien in die folgenden Kategorien unterteilt werden:

  • Im Fall der Ressourcenfreigabe können beispielsweise die Konfigurationsdateidaten und Protokolldateien in einer Datei abgelegt werden, die einheitlich von einem Singleton-Objekt gelesen wird, und dann werden andere Objekte im Dienstprozess an diesen Singleton übergeben. Objekte erhalten diese Konfigurationsinformationen, was das Konfigurationsmanagement in komplexen Umgebungen vereinfachen kann.
  • Bei der Steuerung von Ressourcen wie Thread-Pools verwendet das Design von Multithread-Thread-Pools im Allgemeinen den Singleton-Modus, um die Steuerung der Threads im Pool zu erleichtern.

3. Implementierungsmodus des Singleton-Modus

Die Implementierung des Singleton-Musters umfasst normalerweise drei Elemente:

  1. privater KonstrukteurMachen Sie den Konstruktor der Klasse privat, sodass die Außenseite über das Schlüsselwort new keine Instanz erstellen kann.
  2. Private statische Referenzpunkte auf die eigene Instanz, erstellen Sie eine statische Instanzvariable innerhalb der Klasse, um die eindeutige Instanz zu speichern.
  3. Öffentliche statische Methoden, die ihre eigene Instanz zurückgebenStellen Sie eine statische Methode bereit, damit die Außenwelt die einzige Instanz über diese Methode erhalten kann.

3.1 Hungriges chinesisches Singleton-Muster

Für den Singleton-Modus im Hungry-Stil wird die Singleton-Instanz beim Laden der Klasse erstellt. Dies ist threadsicher, da beim Laden der Klasse ein statisches Objekt erstellt wurde und die Reaktionsgeschwindigkeit beim Aufruf schnell ist. Der Nachteil liegt ebenfalls auf der Hand. Solange andere statische Methoden der Klasse ausgeführt werden oder die Klasse geladen wird, wird diese Instanz trotzdem initialisiert.

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}