GenericFactory as Singleton

P3t*_*rus 8 c++ generics singleton factory

我读了Jim Hyslop和Herb Sutter 的文章抽象工厂,模板风格.该工厂实现为Singleton.它们提供了一种使用RegisterInFactory助手类自动注册类的简便方法.

现在我已经多次阅读过Singletons应该避免的内容,有些人甚至将它们视为反模式,并且只有少数情况下它们是有用的.这是其中之一吗?或者是否有另一种方法可以提供自动批准类的简单方法?

neu*_*uro 2

与以往一样,对于此类主题,没有适用于所有问题的答案。有人说,当它们用作服务的访问时,应该避免使用单例。它的使用类似于全局变量的使用。通过这种方式,您可以掩盖在实现中使用服务 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,单例的使用是一种偶然,而不是设计决策。如果您不想在一篇文章中写出无法表达您观点的内容,这是可以理解的。