Mi rendo conto che c'è molta discussione sui singleton e sul perché sono cattivi. Non è di questa domanda. Comprendo gli svantaggi dei singleton.Voglio un'alternativa di design a un singleton
Ho uno scenario in cui l'utilizzo di un singleton è semplice e sembra avere senso. Tuttavia, voglio un'alternativa che realizzerà ciò di cui ho bisogno senza un sovraccarico.
La nostra applicazione è progettata come un client che in genere viene eseguito su laptop sul campo e comunica con un server back-end. Abbiamo una barra di stato nella parte inferiore dell'applicazione principale. Contiene alcune aree di testo che mostrano varie statue e informazioni oltre a diverse icone. Le icone cambiano la loro immagine per indicare il loro stato. Come un'icona GPS che indica se è collegata o meno così come lo stato di errore.
La nostra classe principale si chiama MobileMain. Possiede l'area della barra di stato ed è responsabile della sua creazione. Abbiamo quindi una classe StatusBarManager. StatusBarManager è attualmente una classe statica, ma potrebbe anche essere un singleton. Ecco l'inizio della lezione.
public static class StatusBarManager
{
static ScreenStatusBar StatusBar;
/// <summary>
/// Creates the status bar that it manages and returns it.
/// </summary>
public static ScreenStatusBar CreateStatusBar()
{
StatusBar = new ScreenStatusBar();
return StatusBar;
}
Il MobileMain richiede StatusBarManager per StatusBar. Quindi utilizza StatusBar. Nessun'altra classe vede StatusBar, solo StatusBarManager.
Gli aggiornamenti alla barra di stato possono provenire praticamente da qualsiasi punto dell'applicazione. Ci sono circa 20 classi che possono aggiornare le aree di testo sulla barra di stato e classi aggiuntive che aggiornano gli stati delle icone.
Ci saranno solo uno StatusBar e un StatusBarManager.
Qualche suggerimento per una migliore implementazione?
Alcuni pensieri che ho avuto:
Fai lo StatusBarManager una classe di istanza. Nella mia classe MobileMain mantieni un'istanza pubblica statica della classe StatusBarManager. Quindi, per eseguire gli aggiornamenti della barra di stato, chiamare MobileMain.StatusBarManager.SetInformationText o qualche altro metodo del gestore. StatusBarManager non sarebbe un singleton, ma MobileMain creerebbe solo un'istanza statica di esso. Il problema qui è che MobileMain ora ha StatusBar e StatusBarManager, che gestisce solo lo StatusBar di sua proprietà. È inoltre disponibile un'istanza statica disponibile a livello globale per StatusBarManager, solo un proprietario diverso.
Un'altra idea era usare qualcosa come una classe EventEggregator. Non ne ho mai usato uno, ma ho letto su di loro. Immagino che il concetto sia che sarebbe una classe globalmente disponibile. In ogni classe che desidera aggiornare la barra di stato pubblicherà un evento StatusBarUpdate. StatusBarManager sarebbe l'unica classe che si iscrive all'evento StatusBarUpdate e riceverà tutte le notifiche. Ho letto però che può finire con perdite con questo approccio se non si presta attenzione a cancellarsi dagli eventi durante la pulizia degli oggetti. Questo approccio vale la pena esaminare?
Questo post contiene un numero di domande. Scegli uno alla volta per ottenere una risposta. – mydogisbox
hai pensato di usare MEF o Unity? Qui si registra una singola istanza di tutto ciò che si desidera con un contenitore in modo da poterlo recuperare da qualche altra parte. – stijn
Una buona lettura, relativa alla denominazione di StatusBarManager; http://www.codinghorror.com/blog/2006/03/i-shall-call-it-somethingmanager.html – Patrick