Редагувати: З іншого питання я надіслав відповідь, що містить посилання на безліч питань / відповідей про одиночних клавіш.
Тож я прочитав нитку Singletons: хороший дизайн чи милицю?
І аргумент все ще вирує.
Я бачу Singletons як шаблон дизайну (хороший і поганий).
Проблема з Singleton - це не шаблон, а скоріше користувачів (вибачте всіх). Всі та їх батько думають, що вони можуть їх правильно виконати (і з багатьох інтерв'ю, які я зробив, більшість людей не можуть). Також тому, що всі думають, що можуть реалізувати правильний Singleton, вони зловживають Шаблоном і використовують його у ситуаціях, що не підходять (замінюючи глобальні змінні на Singletons!)
Тож основні питання, на які потрібно відповісти:
- Коли ви повинні використовувати Singleton
- Як правильно реалізувати Singleton
Я сподіваюся, що ця стаття полягає в тому, що ми можемо зібрати разом в одному місці (замість того, щоб шукати в Google і шукати кілька сайтів) авторитетним джерелом, коли (і як тоді) правильно використовувати Singleton. Також доречним буде перелік антивикористання та поширених поганих реалізацій, що пояснюють, чому вони не працюють, і для хорошої реалізації їх слабкі сторони.
Тож підкачайте м'яч:
я підніму руку вгору і скажу, що це те, що я використовую, але, напевно, є проблеми.
Мені подобається, що "Скотт Майєрс" обробляє цю тему у своїх книгах "Ефективний C ++"
Хороші ситуації використовувати Singletons (не багато):
- Рамки ведення журналів
- Басейни для переробки ниток
/*
* 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;
}
};
ДОБРЕ. Давайте разом отримувати критику та інші реалізації.
:-)