- Quando il dominio specifica che esiste una sola istanza unica di qualcosa che si sta modellando
credo ancora single dovrebbero essere evitati (in Java, almeno).
Ci sono due cose diverse da considerare: il concetto di e il meccanismo di di far rispettare il pattern Singleton.
Il concetto di Singletons ha molti usi, registrazione, configurazione, per non parlare quando il dominio su cui stai lavorando ha effettivamente cose in cui c'è sempre una sola istanza e desideri modellarlo. Cioè un'azienda ha un solo ufficio di elaborazione delle spese e l'invio di moduli di spesa a un ufficio non valido è sbagliato, l'ufficio è in realtà un singleton. Il concetto di un singleton ha molti usi legittimi.
Tuttavia, di solito è il meccanismo che causa il problema. In Java applichiamo un oggetto che non può essere costruito dichiarando il costruttore private
, il problema con questo è che dobbiamo anche fornire un punto di accesso globale all'istanza attraverso la classe concreta. Questo collega tutto nella tua applicazione a quella classe concreta, che non può essere cambiata durante l'esecuzione o derisa nei test unitari. È questo meccanismo che è considerato malvagio, soprattutto in termini di testabilità.
Se il concetto di Singleton può essere separato dai meccanismi poveri, non sarebbe così male. Un esempio, posso pensare è l'ambito @Singleton
disponibile in Guice. Nel contesto di Guice, garantisce un'istanza, ma non lo raggiunge con il malvagio costruttore privato/meccanismo di accesso globale.
La domanda è mal formulata, i singleton sembrano funzionare bene in molte situazioni. Dovrebbe essere "quando le variabili globali sono buone"? –
@just somebody: lascerò che le persone interpretino "singleton" come vogliono. :) –