Modifica: da un'altra domanda ho fornito una risposta che contiene collegamenti a molte domande / risposte sui singoli: Ulteriori informazioni sui singoli qui:
Quindi ho letto il thread Singletons: buon design o stampella?
E l'argomento infuria ancora.
Vedo Singletons come un modello di progettazione (buono e cattivo).
Il problema con Singleton non è il modello ma piuttosto gli utenti (scusate tutti). Tutti e il padre pensano di poterne implementare correttamente (e dalle molte interviste che ho fatto, molte persone non possono). Inoltre, poiché tutti pensano di poter implementare un Singleton corretto, abusano del Pattern e lo usano in situazioni non appropriate (sostituendo le variabili globali con Singletons!).
Quindi le domande principali a cui è necessario rispondere sono:
- Quando dovresti usare un Singleton
- Come si implementa correttamente un Singleton
La mia speranza per questo articolo è che possiamo raccogliere insieme in un unico posto (piuttosto che dover cercare su Google e più siti) una fonte autorevole di quando (e poi come) usare correttamente un Singleton. Sarebbe anche appropriato un elenco di anti-usi e comuni cattive implementazioni che spiegano perché non funzionano e per buone implementazioni i loro punti deboli.
Quindi fai rotolare la palla:
terrò la mia mano in alto e dirò che è quello che uso ma probabilmente ho problemi.
Mi piace "Scott Myers" che tratta l'argomento nei suoi libri "Effective C ++"
Buone situazioni per usare i Singleton (non molti):
- Framework di registrazione
- Pool di riciclaggio del filo
/*
* C++ Singleton
* Limitation: Single Threaded Design
* See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
* For problems associated with locking in multi threaded applications
*
* Limitation:
* If you use this Singleton (A) within a destructor of another Singleton (B)
* This Singleton (A) must be fully constructed before the constructor of (B)
* is called.
*/
class MySingleton
{
private:
// Private Constructor
MySingleton();
// Stop the compiler generating methods of copy the object
MySingleton(MySingleton const& copy); // Not Implemented
MySingleton& operator=(MySingleton const& copy); // Not Implemented
public:
static MySingleton& getInstance()
{
// The only instance
// Guaranteed to be lazy initialized
// Guaranteed that it will be destroyed correctly
static MySingleton instance;
return instance;
}
};
OK. Consente di ottenere alcune critiche e altre implementazioni insieme.
:-)