我读了文章Abstract Factory, Template Style吉姆·希斯洛普 (Jim Hyslop) 和赫伯·萨特 (Herb Sutter)。这个工厂是作为单例实现的。他们提供了一种使用 RegisterInFactory 助手类自动注册类的简单方法。
现在我已经多次读到应该避免单例,有些人甚至认为它们是反模式,并且只有少数情况下它们很有用。 这是其中之一吗?或者是否有一种替代方法可以提供如此简单的自动注册类的方法?
最佳答案
对于此类主题,没有适用于所有问题的答案。有人说单例作为访问服务的方式应该避免。它的使用类似于全局变量的使用。这样您就可以掩盖您在实现中使用服务 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();
}
这种方式通常被认为更好,因为类之间的耦合更轻。然而,对于众所周知在框架中广泛使用的某些服务,使用单例更为简单。这对于单个服务是有意义的,该服务允许您访问框架中的所有其他服务,例如 ^^ 它通常用于技术服务,例如日志记录。
我的2c
编辑:我读了这篇文章,因为重点是AbstractFactories,单例的使用是偶然的,而不是设计决定。这是可以理解的,在一篇文章中,您不想写那些不会让您达到目的的东西。
关于c++ - GenericFactory 作为单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733830/