Как всегда для такого рода предмета, нет ответа, который бы относился ко всем проблемам.Некоторые говорили, что следует избегать синглтонов, когда они используются в качестве доступа к услуге.Это использование сродни использованию глобальных переменных.Таким образом вы маскируете тот факт, что вы используете службу X в своей реализации:
// in header
class MyUsefulClass
{
public:
void doSomethingUseful();
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
MyWonderfulService::instance().doService1();
// ...
MyWonderfulService::instance().doService2();
}
Вы создаете связь с MyWonderfulService, которую пользователи вашего класса не могут угадать.Более того, Вы не можете легко протестировать свой полезный класс с помощью фиктивного сервиса ...
Вот почему я обычно предпочитаю инверсию зависимости :
// in header
class MyUsefulClass
{
public:
void setServiceToUse(MyService&);
void doSomethingUseful();
// [...]
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
_myService->doService1();
// ...
_myService->doService2();
}
Этот способ обычносчитается лучше, так как связь между классами легче.Тем не менее, для некоторых служб, которые, как известно, широко используются в рамках, проще использовать синглтон.Это имеет смысл для отдельной службы, которая представляет собой службу, которая предоставляет вам доступ ко всем другим службам в рамках, например, ^^ Она часто используется для технических служб, таких как, например, ведение журнала.
my2c
Edit: я прочитал статью, так как основное внимание уделяется AbstractFactories, использование синглтона является случайным, а не дизайнерским решением.Это понятно из статьи, в которой вы не хотите писать вещи, которые не приведут вас к вашей мысли.