Изменить: Из другого вопроса я дал ответ, который содержит ссылки на множество вопросов/ответов о синглонах: Подробнее о синглонах здесь:
Итак, я прочитал нить Singletons: хороший дизайн или костыль?
И аргумент все еще бушует.
Я вижу синглтоны как шаблон дизайна (хороший и плохой).
Проблема с Singleton - это не шаблон, а пользователи (извините всех). Все и их отец думают, что могут правильно их реализовать (и из многих интервью, которые я сделал, большинство людей не может). Также потому, что все думают, что могут реализовать правильный синглтон, они злоупотребляют шаблоном и используют его в ситуациях, которые не подходят (заменяя глобальные переменные на Singletons!).
Таким образом, основными вопросами, на которые нужно ответить, являются:
- Когда вы должны использовать Singleton
- Как вы правильно реализуете Singleton
Моя надежда на эту статью состоит в том, что мы можем собирать вместе в одном месте (вместо того, чтобы иметь Google и искать несколько сайтов) авторитетным источником того, когда (а затем как) правильно использовать Singleton. Также уместно будет список Анти-Использование и распространенные плохие реализации, объясняющие, почему они не работают и для хороших реализаций их слабости.
Так получилось, что мяч катится:
Я подниму руку и скажу, что это то, что я использую, но, вероятно, проблемы.
Мне нравится "Скотт Майерс", обрабатывающий предмет в своих книгах "Эффективный С++"
Хорошие ситуации для использования синглтонов (не так много):
- Структуры ведения журнала
- Пулы для регенерации потоков.
/*
* 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. Давайте рассмотрим некоторые критические замечания и другие реализации.
: -)