Edit: À partir d'une autre question, j'ai fourni une réponse qui contient des liens vers de nombreuses questions / réponses sur les singletons: Plus d'informations sur les singletons ici:
J'ai donc lu le fil Singletons: un bon design ou une béquille?
Et l'argument fait toujours rage.
Je vois les singletons comme un modèle de conception (bon et mauvais).
Le problème avec Singleton n'est pas le Pattern mais plutôt les utilisateurs (désolé tout le monde). Tout le monde et leur père pensent qu'ils peuvent en appliquer un correctement (et d'après les nombreuses interviews que j'ai faites, la plupart des gens ne le peuvent pas). Aussi parce que tout le monde pense pouvoir implémenter un Singleton correct, ils abusent du Pattern et l'utilisent dans des situations qui ne sont pas appropriées (en remplaçant les variables globales par des Singletons!).
Les principales questions auxquelles il faut répondre sont donc:
- Quand devez-vous utiliser un Singleton
- Comment implémenter correctement un singleton
Mon espoir pour cet article est que nous puissions rassembler ensemble en un seul endroit (plutôt que d'avoir à rechercher sur Google et plusieurs sites) une source faisant autorité pour savoir quand (et ensuite comment) utiliser correctement un Singleton. Une liste d'anti-utilisations et de mauvaises implémentations courantes serait également appropriée, expliquant pourquoi elles ne fonctionnent pas et pour de bonnes implémentations, leurs faiblesses.
Alors lancez le ballon:
je vais tenir ma main et dire que c'est ce que j'utilise mais a probablement des problèmes.
J'aime le traitement du sujet par "Scott Myers" dans ses livres "Effective C ++"
Bonnes situations pour utiliser des singletons (pas beaucoup):
- Cadres de journalisation
- Pools de recyclage de fils
/*
* 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;
}
};
D'ACCORD. Permet de rassembler quelques critiques et autres implémentations.
:-)