CSharp:Singleton
From Aino Wiki
Da leggere Microsoft.
Contents
Introduzione
Questo pattern consiste nel costruire una classe, in singola istanza, che fornisce un punto di accesso globale alle proprie risorse. (E' responsabilità della classe singleton la verifica che ci sia una sola istanza).
- Utile nei casi in cui occorre condividere globalmente risorse come dati (Proprietà) e comportamenti (Metodi).
- Ci consente di evitare la possibilità più di una istanza dello stesso oggetto.
Esempio
Un esempio può essere quello nell'implementazione del login che una volta eseguito se ne vuol conservare lo stato per tutto il tempo in cui l'utente ha la sessione aperta. In questo stato si conserva la policy associata all'utente corrente.
Diagramma delle classi preso dal videocorso Linda.com (di LinkedIn):
Codice
Classe per il Singleton
namespace Singleton { public class Policy { private static Policy _instance; public static Policy Instance { get { if (_instance == null) { _instance = new Policy(); } return _instance; } } public Policy() { } private int Id { get; set; } = 123; private string Insured { get; set; } = "John Roy"; public string GetInsuredName() => Insured; } }
Richiamo del Singleton
Quando ci serve lo richiameremo come segue.
namespace Singleton { public class Program { static void Main(string[] args) { //var policy = new Policy(); <--- non serve reinstanziarlo ogni volta var insuredName = Policy.Instance.GetInsuredName(); Console.WriteLine(insuredName); } } }
Correzione Thread Safe
Il singleton di sopra NON è THREAD SAFE quindi lo si corregge come segue:
namespace Singleton { public class Policy { // v-- Approccio popolare... ma si dovrà fare meglio private static readonly object _lock = new object(); private static Policy _instance; public static Policy Instance { get { // Per consentire un thread per volta lock (_lock) { if (_instance == null) { _instance = new Policy(); } return _instance; } } } } }
Che migliorato diventa (poche righe stesso risultato di sopra...):
namespace Singleton { public class Policy { // v-- Approccio popolare... ma si dovrà fare meglio //private static readonly object _lock = new object(); // miglioramento thread safe ---v private static readonly Policy _instance = new Policy(); public static Policy Instance { get { // Per consentire un thread per volta return _instance; } } public Policy() { } private int Id { get; set; } = 123; private string Insured { get; set; } = "John Roy"; public string GetInsuredName() => Insured; } }
Mappa e Links
C# | Design Pattern | Teoria