与以往一样,对于此类主题,没有适用于所有问题的答案。有人说,当它们用作服务的访问时,应该避免使用单例。它的使用类似于全局变量的使用。通过这种方式,您可以掩盖在实现中使用服务 X 的事实:
// in header
class MyUsefulClass
{
public:
void doSomethingUseful();
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
MyWonderfulService::instance().doService1();
// ...
MyWonderfulService::instance().doService2();
}
Run Code Online (Sandbox Code Playgroud)
您使用 MyWonderfulService 创建了一个您的类的用户无法猜测的耦合。此外,您无法使用模拟服务轻松测试有用的类......
这就是为什么我通常更喜欢依赖倒置:
// in header
class MyUsefulClass
{
public:
void setServiceToUse(MyService&);
void doSomethingUseful();
// [...]
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
_myService->doService1();
// ...
_myService->doService2();
}
Run Code Online (Sandbox Code Playgroud)
通常认为这种方式更好,因为类之间的耦合更轻。然而,对于某些众所周知在框架中广泛使用的服务,使用单例会更简单。对于单个服务来说这是有意义的,该服务使您可以访问框架中的所有其他服务,例如 ^^ 它通常用于技术服务,例如日志记录。
我的2c
编辑:我读了这篇文章,因为重点是 AbstractFactories,单例的使用是一种偶然,而不是设计决策。如果您不想在一篇文章中写出无法表达您观点的内容,这是可以理解的。