Синглтон-паттерн Мейера в большинстве случаев работает достаточно хорошо, и в некоторых случаях он не обязательно платит за поиск чего-то лучшего. Пока конструктор никогда не сгенерирует и нет никаких зависимостей между синглетонами.
Синглтон - это реализация для глобально доступного объекта (отныне GAO), хотя не все GAO являются синглетонами.
Сами регистраторы не должны быть одиночными, но в идеале средства для регистрации должны быть глобально доступны, чтобы отделить, где генерируется сообщение журнала, откуда или как оно регистрируется.
Ленивая загрузка / отложенная оценка - это другое понятие, и синглтон, как правило, также реализует это. У него много собственных проблем, в частности, безопасности потоков и проблем, если он терпит неудачу с исключениями, так что то, что казалось хорошей идеей в то время, оказывается не таким уж большим. (Немного похоже на реализацию COW в строках).
Имея это в виду, GOA можно инициализировать так:
namespace {
T1 * pt1 = NULL;
T2 * pt2 = NULL;
T3 * pt3 = NULL;
T4 * pt4 = NULL;
}
int main( int argc, char* argv[])
{
T1 t1(args1);
T2 t2(args2);
T3 t3(args3);
T4 t4(args4);
pt1 = &t1;
pt2 = &t2;
pt3 = &t3;
pt4 = &t4;
dostuff();
}
T1& getT1()
{
return *pt1;
}
T2& getT2()
{
return *pt2;
}
T3& getT3()
{
return *pt3;
}
T4& getT4()
{
return *pt4;
}
Это не нужно делать так грубо, и явно в загруженной библиотеке, содержащей объекты, вы, вероятно, захотите, чтобы какой-то другой механизм управлял их временем жизни. (Поместите их в объект, который вы получите при загрузке библиотеки).
Что касается того, когда я использую синглтоны? Я использовал их для 2 вещей
- таблица синглтона, которая указывает, какие библиотеки были загружены с помощью dlopen
- Обработчик сообщений, на который регистраторы могут подписаться и на который вы можете отправлять сообщения. Требуется специально для обработчиков сигналов.