我读了Jim Hyslop和Herb Sutter撰写的文章Abstract Factory, Template Style。该工厂实现为Singleton。它们提供了一种使用RegisterInFactory助手类自动注册类的简便方法。
现在我已经多次阅读过Singletons应该避免的事情,有些人甚至将它们视为反模式,并且只有少数情况下它们是有用的。 这是其中之一吗?或者是否有另一种方法可以提供自动批准类的简单方法?
答案 0 :(得分:2)
与此类主题一样,没有适用于所有问题的答案。有人说当用作访问服务时应该避免使用单例。它的用途类似于全局变量的使用。这样就掩盖了在实现中使用服务X的事实:
// in header
class MyUsefulClass
{
public:
void doSomethingUseful();
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
MyWonderfulService::instance().doService1();
// ...
MyWonderfulService::instance().doService2();
}
您创建了与MyWonderfulService的耦合,您的类的用户无法猜测。 而且,您无法使用模拟服务轻松测试您的有用课程......
这就是我通常喜欢dependancy inversion的原因:
// in header
class MyUsefulClass
{
public:
void setServiceToUse(MyService&);
void doSomethingUseful();
// [...]
};
// in .cpp
MyUsefulClass::doSomethingUseful()
{
// ...
_myService->doService1();
// ...
_myService->doService2();
}
这种方式通常被认为更好,因为类之间的耦合更轻。然而,对于一些众所周知在框架中广泛使用的服务,使用单例是更简单的。对于作为服务的单个服务来说,它是有意义的,它允许您访问框架中的所有其他服务,例如^^它通常用于技术服务,例如日志记录。
MY2C
编辑:我读过这篇文章,因为焦点在于AbstractFactories,单例的使用是偶然的,而不是设计决策。在一篇文章中你可以理解这一点,在这篇文章中你不想写出那些无法达到你要求的东西。