Table of contents
Tipologia: Creazionale
Complessità: ★☆☆☆☆
Popolarità: ★★★★★
Introduzione
Il pattern Singleton controlla la creazione delle istanze di una classe assicurandosi che ne venga creata al massimo una.
Il alcuni casi questo è fondamentale, come ad esempio nel caso di un oggetto di configurazione, una cache, un pool di thread, ...
Teoria
Questo pattern è probabilmente il più semplice del lotto e si basa su una singola classe.
È necessario garantire che la classe non possa essere istanziata da chiunque mediante l'utilizzo del costruttore, quindi bisogna renderlo privato ed accessibile solo dall'interno.
Una volta creata l'istanza bisognerà memorizzarla in una proprietà di classe privata in modo che sia accessibile solamente dalla classe stessa che la esporrà tramite un metodo pubblico, anch'esso statico, chiamato GetInstance
.
Quando viene chiamato questo metodo si esegue un controllo sull'esistenza dell'istanza della classe, se non esiste si provvede alla sua creazione ed infine si ritorna al chiamante.
Struttura
Implementazione
public class Singleton {
private static Singleton instance = null;
public string SharedValue { get; init; }
private Singleton() {
this.SharedValue = Guid.NewGuid().ToString();
}
public static Singleton GetInstance() {
if (instance == null) // Istanzio la classe se non è già stato fatto
instance = new();
return instance;
}
}
Utilizzo:
Singleton instance1 = Singleton.GetInstance();
Singleton instance2 = Singleton.GetInstance();
Singleton instance3 = Singleton.GetInstance();
Console.WriteLine($"Instanza 1: { instance1.SharedValue }");
Console.WriteLine($"Instanza 2: { instance2.SharedValue }");
Console.WriteLine($"Instanza 3: { instance3.SharedValue }");
Risultato:
Instanza 1: e604ae04-3027-445c-8401-fe76265ad607
Instanza 2: e604ae04-3027-445c-8401-fe76265ad607
Instanza 3: e604ae04-3027-445c-8401-fe76265ad607
Conclusione
L'utilizzo del pattern Singleton ci consente di evitare l'utilizzo di variabili globali e mantenere tutto più pulito ed organizzato.
Allo stesso tempo viola però il principio di Singola Responsabilità visto che gestisce il proprio ciclo di vita oltre al controllo che ha sulla propria creazione.
👋