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 17:56

Print

Comments on this entry:

# Singleton, ora con snippet VS2005

Left by FoxyBlog at 02/09/2006 22:10
Gravatar
Comments have been closed on this topic.
«ottobre»
domlunmarmergiovensab
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789