Condivisione della tecnologia

Implementazione del modello singleton

2024-07-11

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

1. Introduzione

1.1 Contesto

Quando un'applicazione deve controllare la condivisione delle risorse, eseguire la gestione della configurazione e le operazioni di registrazione dei registri, un requisito comune è utilizzare un punto di accesso globale in modo che il programma possa accedervi tramite questo punto di accesso globale, indipendentemente da dove si trovi informazioni sull'istanza rilevanti. Per soddisfare questa esigenza possiamo utilizzare il Singleton Pattern. Il modello singleton garantisce che una classe abbia una sola istanza e fornisce un punto di accesso globale per accedere a tale istanza.

Nello specifico, il modello singleton solitamente fornisce un metodo statico (come getInstance()) che restituisce l'unica istanza della classe. Poiché questo metodo è statico, può essere chiamato senza creare un'istanza della classe. Ciò significa che qualsiasi codice che ha accesso alla classe può ottenere un'istanza singleton chiamando questo metodo statico.

1.2 Scopo

Questo articolo introdurrà in dettaglio i concetti di base e i passaggi di implementazione del modello singleton. Attraverso questo articolo sarai in grado di comprendere come funziona il modello singleton e imparare come utilizzarlo in modo efficace in progetti reali.

2. Cos'è il modello singleton?

Per fare un esempio interessante, il modello singleton è come l'alone del protagonista in un mondo anime. Non importa come si sviluppa la trama, c'è sempre un solo protagonista, e tutti sanno che è lui il fulcro della storia. In questo modo, indipendentemente da come si svolge la storia, tutti possono trovare la stessa persona per portare avanti la trama.

2.1 Vantaggi e svantaggi del modello Singleton

vantaggio

Garantire un'istanza singola: evita la creazione duplicata di istanze e risparmia risorse.
punto di accesso globale: Comodo accesso globale e chiamate semplificate.
Inizializzazione pigra: crea istanze su richiesta per migliorare le prestazioni.

discordanza

Difficile da scalare: Le classi singleton sono spesso difficili da estendere perché il costruttore è privato.
potenziali problemi di prestazioni: in un ambiente ad alta concorrenza, alcune implementazioni potrebbero presentare problemi di prestazioni.
Difficoltà nel testare: Il modello singleton può rendere difficili i test perché è uno stato globale.

2.2 Scenari di utilizzo della modalità singleton

In base alle caratteristiche del modello singleton, i suoi scenari di utilizzo possono essere suddivisi nelle seguenti categorie:

  • Ad esempio, nel caso della condivisione delle risorse, i dati del file di configurazione e i file di registro possono essere inseriti in un file. Questi dati di configurazione o file di registro vengono letti in modo uniforme da un oggetto singleton e quindi altri oggetti nel processo del servizio passano questo singleton. Gli oggetti ottengono queste informazioni di configurazione, che possono semplificare la gestione della configurazione in ambienti complessi.
  • Nel caso del controllo delle risorse, come i pool di thread, la progettazione di pool di thread multi-thread adotta generalmente la modalità singleton per facilitare il controllo dei thread nel pool.

3. Modalità di implementazione della modalità singleton

L'implementazione del modello singleton solitamente include tre elementi:

  1. costruttore privato, rendere privato il costruttore della classe in modo che l'esterno non possa creare un'istanza tramite la parola chiave new.
  2. Punti di riferimento statici privati ​​alla propria istanza, crea una variabile di istanza statica all'interno della classe per salvare l'istanza univoca.
  3. Metodi statici pubblici che restituiscono la propria istanza, fornire un metodo statico in modo che il mondo esterno possa ottenere l'unica istanza tramite questo metodo.

3.1 Modello Singleton cinese affamato

Per la modalità singleton in stile Hungry, l'istanza singleton viene costruita quando la classe viene caricata, il che è thread-safe perché un oggetto statico è stato creato quando la classe viene caricata e la velocità di risposta è elevata quando viene chiamata. Anche lo svantaggio è evidente: l'efficienza delle risorse non è elevata finché vengono eseguiti altri metodi statici della classe o la classe viene caricata, questa istanza verrà comunque inizializzata.

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