Bearbeiten: Von einer anderen Frage habe ich eine Antwort bereitgestellt, die Links zu vielen Fragen / Antworten zu Singletons enthält: Weitere Informationen zu Singletons hier:
Also habe ich den Thread Singletons gelesen : gutes Design oder eine Krücke?
Und der Streit tobt immer noch.
Ich sehe Singletons als Designmuster (gut und schlecht).
Das Problem mit Singleton ist nicht das Muster, sondern die Benutzer (sorry an alle). Alle und ihr Vater glauben, dass sie eines richtig umsetzen können (und aus den vielen Interviews, die ich gemacht habe, können die meisten Menschen nicht). Auch weil jeder glaubt, einen korrekten Singleton implementieren zu können, missbrauchen sie das Muster und verwenden es in Situationen, die nicht angemessen sind (Ersetzen globaler Variablen durch Singletons!).
Die wichtigsten Fragen, die beantwortet werden müssen, sind:
- Wann sollten Sie einen Singleton verwenden?
- Wie implementiere ich einen Singleton richtig?
Ich hoffe für diesen Artikel, dass wir an einem einzigen Ort (anstatt mehrere Websites googeln und durchsuchen zu müssen) eine maßgebliche Quelle dafür sammeln können, wann (und wie) ein Singleton richtig verwendet wird. Ebenfalls angemessen wäre eine Liste von Anti-Usages und häufigen schlechten Implementierungen, die erklären, warum sie nicht funktionieren, und für gute Implementierungen ihre Schwächen.
Also bring den Ball ins Rollen:
Ich werde meine Hand hochhalten und sagen, dass ich das benutze, aber wahrscheinlich Probleme habe.
Ich mag "Scott Myers" Umgang mit dem Thema in seinen Büchern "Effective C ++"
Gute Situationen, um Singletons zu verwenden (nicht viele):
- Protokollierungs-Frameworks
- Fadenrecyclingpools
/*
* 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. Lassen Sie uns gemeinsam Kritik und andere Implementierungen zusammenbringen.
:-)