Ignazio Catanzaro

Sviluppatore Software

C# .Net

Archivio Posts
Anno 2012

Anno 2011

Anno 2010
Sondaggio
Introdurre argomenti di software engineering in un blog può essere utile?

Si
No

Pattern Singleton!

Ciao a tutti!

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;
}
}
}

Il 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;
}
}
}
}

Alla prossima!

Ignazio Catanzaro
sabato, 03 apr 2010 Ore. 10.32

Calendario
dicembre 2024
lmmgvsd
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Ora e Data
Statistiche
  • Views Home Page: 33.611
  • Views Posts: 46.408
  • Views Gallerie: 0
  • n° Posts: 24
  • n° Commenti: 12
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003