Pattern Singleton

A causa dello sviluppo di un progetto Enterprise, sto utilizzando più volte il pattern Singleton per far fronte alle varie esigenze.
Il pattern Singleton permette allo sviluppatore di creare una, ed una sola istanza di una classe, inibendone la libera istanziazione.
Molti di voi staranno gia pensando il motivo per il quale utilizzare questo pattern.
Elenco dei brevi punti che vi chiariranno sicuramente le idee :

  1. Si ha un’unico accesso controllato alla classe;
  2. Evità di creare variabili globali;
  3. Permette quindi di essere accessibile da qualunque oggetto, nello stato in cui si trova;
  4. Permette di restringere il numero degli oggetti creati.

Passiamo ad un’esempio C# :

public class SingletonClass {

//Campo privato utilizzato dalla proprietà
private static SingletonClass _istanza = null;
//Costruttore privato per rendere la prorpietà Istanza unico punto di accesso
private SingletonClass() { }

//Proprietà di accesso
public static SingletonClass Istanza
{
get
{
if(istanza == null){
istanza = new SingletonClass();
return Istanza;
}
}
}

I pattern Singleton sopra descritto ha pero un problema riguardante gli accessi da parte di più thread contemporaneamente, nello specifico potrebbero essere create due istanze  di SingletoneClass in questa istruzione :

istanza = new SingletonClass();

Risolvere il problema è più semplice di quanto si pensi, basta infatti bloccare l’accesso all’istruzione di istanziazione attraverso lo statement lock (nel caso si utilizzi C#).

Esempio C# :

public class SingletonClass {

//Campo privato utilizzato dalla proprietà
private static SingletonClass _istanza = null;

static readonly object lockObj = new object();
//Costruttore privato per rendere la prorpietà Istanza unico punto di accesso
private SingletonClass() { }

//Proprietà di accesso
public static SingletonClass Istanza
{
get
{
lock(lockObj)
{
if(istanza == null){
istanza = new SingletonClass();
return Istanza;
}
}
}
}

One thought on “Pattern Singleton

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...