Modifier : Dans 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 de discussion Les singletons : bonne conception ou béquille ?
Et la dispute fait toujours rage.
Je considère les singletons comme un modèle de conception (bon et mauvais).
Le problème avec Singleton n'est pas le modèle mais plutôt les utilisateurs (désolé tout le monde). Tout le monde et son père pense qu'il peut en implémenter un correctement (et d'après les nombreux entretiens que j'ai réalisés, la plupart des gens ne le peuvent pas). De plus, 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 (remplacer des variables globales par des Singletons !).
Les principales questions auxquelles il faut répondre sont donc les suivantes :
- Quand utiliser un Singleton
- Comment implémenter correctement un Singleton
Mon espoir pour cet article est que nous puissions rassembler en un seul endroit (plutôt que de devoir chercher sur Google et sur de multiples sites) une source faisant autorité sur quand (et ensuite comment) utiliser correctement un Singleton. Une liste d'anti-usages et de mauvaises implémentations courantes expliquant pourquoi elles ne fonctionnent pas et leurs faiblesses pour les bonnes implémentations serait également appropriée.
Alors, lancez-vous :
Je vais lever la main et dire que c'est ce que j'utilise mais qu'il y a probablement des problèmes.
J'aime la façon dont Scott Myers traite le sujet dans son livre "Effective C++".
Les bonnes situations pour utiliser les singletons (pas beaucoup) :
- Cadres de journalisation
- Bassins de recyclage des 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;
}
};
- OK. Rassemblons des critiques et d'autres mises en œuvre.
- -)
37 votes
Que se passe-t-il si vous décidez plus tard que vous voulez plusieurs enregistreurs ? Ou plusieurs pools de threads ? Si vous ne voulez qu'un seul logger, alors créez une seule instance et rendez-la globale. Les singletons ne sont bons que si vous avez absolument besoin qu'il n'y en ait qu'un seul et qu'il soit global, IMHO.
4 votes
Qui a dit qu'un cadre ne peut avoir qu'une seule instance de logger. Une seule instance représentant le Framework. Framwork peut alors vous donner des loggers spécifiques.
0 votes
Oui. Je n'utiliserais pas un singeltong comme un threadpool. Je lance juste des idées pour susciter des réponses.
0 votes
@Dan Singleton qui implémente le modèle de stratégie. Le comportement est abstrait du singleton. Singleton est un point d'entrée unique. Ne pas avoir deux loggers, avoir un logger qui peut décider comment loguer. Vous ne pouvez pas sortir sur un seul log à la fois, pas besoin d'en avoir deux.
6 votes
Xaade : que se passe-t-il si vous voulez enregistrer dans deux fichiers ? Ou vers une base de données ? Ou un socket réseau ? Ou un widget de l'interface graphique ? Le point est, n'ajoutez pas de restrictions artificielles - il n'y a pas besoin de le faire. Combien de fois n'avez-vous pas créé accidentellement deux boucles for au lieu d'une seule ? Si vous ne voulez qu'un seul enregistreur, créez-en un seul.