Recentemente ho visto molti post sul perché i Singletons dovrebbero essere evitati. Tuttavia, non riesco a vedere nessuno di questi problemi con la seguente soluzione a un problema comune: l'ereditarietà statica.
Ad esempio, di recente stavo lavorando su una libreria che cancella il codice sorgente HTML di un sito Web e ne analizza il contenuto in oggetti. Il problema qui è che il sito ha diversi tipi di contenuti - articoli, video, ecc. Nel mio codice iniziale, ho avuto diverse diverse classi di "fornitori" statici, ovvero ArticleSupplier
, che ho trovato rapidamente condiviso un sacco di codice boilerplate (ad es. verifica degli argomenti).
Avrei potuto rendere le classi basate su istanze, ma sembra inutile: new ArticleSupplier()
non ha stato; tutti i suoi metodi dipendono dagli argomenti passati a loro. Istanziare un altro è solo uno spreco di memoria.
Questo mi ha portato a pensare all'utilizzo del pattern Singleton: una classe base può eseguire controlli di codice di tipo standard e quindi chiamare l'implementazione della classe derivata; la classe derivata potrebbe quindi controllare l'accesso con un singleton. Ecco un semplice esempio in C #:
abstract class Supplier
{
IEnumerable<IModel> RecentModels(int amount)
{
return ModelsBefore(DateTime.Now, amount);
}
IEnumerable<IModel> ModelsBefore(DateTime date, int amount)
{
CheckDate(date);
CheckAmount(amount);
return InternalBefore(date, amount);
}
abstract IEnumerable<IModel> InternalBefore(DateTime date, int amount);
}
class ArticleSupplier
{
private static readonly ArticleSupplier _Instance = new ArticleSupplier();
private ArticleSupplier() { }
public static ArticleSupplier Instance { get { return _Instance; } }
override IEnumerable<IModel> InternalBefore(DateTime date, int amount)
{
// implementation
}
}
Ora, puoi concentrarti sull'implementazione entro ArticleSupplier
senza scrivere lo stesso codice boilerplate e allo stesso tempo controllare l'istanza dell'oggetto. Vorrei sottolineare ancora una volta che questo è completamente sicuro per i thread perché il singleton non ha stato , motivo per cui il metodo era statico in primo luogo.
È un uso appropriato del pattern Singleton, o ci sono ancora alcune trappole che mi mancano?