Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:Singleton

From Aino Wiki

Jump to: navigation, search

Da leggere Microsoft.

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):

Pattern Singleton Diagramma01.png

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


Visual Studio

Author