Generalemte se abbiamo scritto il codice per bene, questa cosa non avviene, tuttavia potebbe succedere se e solo abbiamo commesso qualche leggerezza nella gestione della classe singleton.
Questo esempio mostra come un metodo "creato appositamente" crei un effetto davvero indesiderato.
public class SingleInstance { private static iInstance itx = null; public static iInstance getInstance() { if (SingleInstance.itx == null) { itx = new Original(); return itx; } return itx; } public static void ChangeInstance() { SingleInstance.itx = new Mock(); } }
Questi i miei due oggetti che rappresenteranno il singleton
public interface iInstance
{
string DoGetValue();
}
public class Original : iInstance
{
private string _value = "Orginal";
public string DoGetValue()
{
return _value;
}
}
public class Mock : iInstance
{
private string _value = "Mock";
public string DoGetValue()
{
return _value;
}
}
Quessto è il metodo che utilizzo per effettuare il test.
Dal settimo elemento modifichiamo il nostro singleton..
private void btnStart_Click(object sender, EventArgs e) { string v = ""; for (int i = 0; i < 15; i++) { v = Singleton.SingleInstance.getInstance().DoGetValue(); lstEvents.Items.Add("s[" + i.ToString() + "]:" + v); lstEvents.Refresh(); Thread.Sleep(100); if (i == 7) { // Simuliamo // che qualcuno ci cambi le // carte in tavola Singleton.SingleInstance.ChangeInstance(); } } }
Morale in
v = Singleton.SingleInstance.getInstance().DoGetValue()
Ottengo il valore "original" fino a quando non cambio il contenuto del mio singleton..
Una variazione sul tema ... che a tutti gli effetti rende immutabile il singleton potrebbe essere questa...
Singleton.iInstance ist = Singleton.SingleInstance.getInstance();
...
...
v = ist.DoGetValue();L'implicazione è che l'istanza rimarrebbe strettamente legata ad una variabile senza dover mai essere reistanziata...
La secelta giusta ??? la prima ma se e solo se nessuno ti cambia da il naso il valore del singleton stesso.
Nessun commento:
Posta un commento