Singleton

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 14.56

Print

Comments on this entry:

# re: Singleton

Left by Andrea Boschin at 14/09/2005 15.05
Gravatar
se guardi questo post, e i relativi commenti vedrai che è meglio la tua soluzione piuttosto che quella del lazy init: http://www.boschin.it/blogs/radicalmente/archive/2004/09/15/2435.aspx

comunque mi urge una piccola precisazione: oltre al tuo ultimo esempio, che considero una buona implementazione, bisogna anche dire che una classe "statica" in fin dei conti è un singleton. In c# una classe statica non esiste (per ora), ma comunque una classe con tutti metodi statici in definitiva è un singleton di cui non hai bisogno di ottenere istanza potendo quindi abbreviare le chiamate nel codice. tutto dipenda da cosa devi fare...

# re: Singleton

Left by Andrea Boschin at 14/09/2005 15.06
Gravatar
ah, per inciso il tuo singleton oltre che il ctor privato dovrebbe essere anche sealed.

# re: Singleton

Left by Simone Chiaretta at 14/09/2005 15.21
Gravatar
intendi sealed la classe, non il ctor, giusto?
sealed si può applicate solo a classi

# re: Singleton

Left by Andrea Boschin at 14/09/2005 15.30
Gravatar
sìsì, la frase è venuta male per la fretta, ma intendevo quello.

# re: Singleton

Left by Diego at 14/09/2005 15.50
Gravatar
Se non sbaglio C# 2.0 prevede le classi statiche, giusto no?

# re: Singleton

Left by Andrea Boschin at 14/09/2005 15.57
Gravatar
infatti ho scritto "per ora"...

# re: Singleton

Left by Adrian Florea at 19/09/2005 11.04
Gravatar
"The prevalence of Singletons in a design is inversely proportional to the maturity of the design, and the designers" - Brian Button's Law :-)
http://blogs.msdn.com/scottdensmore/archive/2004/05/25/140827.aspx

# Singleton, ora con snippet VS2005

Left by FoxyBlog at 02/09/2006 19.10
Gravatar
Comments have been closed on this topic.
«luglio»
domlunmarmergiovensab
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678