Ultimamente sto mettendo il Pattern Singleton un po' ovunque... e spiegando ad un mio collega
cos'è il Singleton gli ho girato il link della DO Factory con in Pattern della GOF spiegati in C#.
E ho notato che l'esempio di codice proposto è con la lazy
initialization:
// "Singleton"
class Singleton
{
// Fields
private static Singleton instance;
// Constructor
protected Singleton() {}
// Methods
public static Singleton Instance()
{
// Uses "Lazy initialization"
if( instance == null )
instance = new Singleton();
return instance;
}
}
Nelle mie molte implementazioni invece ho sempre usato la forma senza
lazy initialization:
class Singleton
{
// Fields
private static Singleton instance = new Singleton();
// Constructor
private Singleton() {}
// Properties
public static Singleton Instance
{
get {
return instance;
}
}
}
cioè, con l'istanza caricata nella parte "statica" della classe.
Mi chiedevo quale fosse il metodo migliore, e dopo un post sul forum di ugi, sono arrivato alla conclusione
che il metodo migliore, a meno di problematiche realtive alle cose fatte nel
costruttore (tipo accesso a risorse lente, o processi elaborativi lunghi) è
quella che uso io (anche se andrebbe aggiunto anche il "readonly
" all'instanza)(e che mi pare
di aver visto anche nei vari esempi di codice dei vari workshop UGI).
Per valutare meglio le opzioni vi indico un link molto
interessante:
Implementing the Singleton Pattern in C#:
questo prende in
considerazione le varie problematiche di thread-safety, ecc..., ma arriva ad una
soluzione basata sui costruttori static, che, dicono (Brad Adams, Corrado, Adrian ) essere una pratica sconsigliata.
Massimo propone
class Pippo
{
public static readonly Pluto obj = new Pluto();
}
(in effetti aveva messo private,
ma mi sa che era un'errore ) ma senza arrivare a quest'estremo di semplcità la
soluzione ottimale potrebbe essere:
public sealed class Singleton
{
// Fields
private readonly static Singleton instance = new Singleton();
// Constructor
private Singleton() {}
// Properties
public static Singleton Instance
{
get {
return instance;
}
}
}
UPDATE: aggiornato codice dopo suggerimento dei commenti
powered by IMHO 1.2
posted @ mercoledì 14 settembre 2005 17:56