GenericFactory as Singleton

时间:2011-01-19 09:54:17

标签: c++ singleton generics factory

我读了Jim Hyslop和Herb Sutter撰写的文章Abstract Factory, Template Style。该工厂实现为Singleton。它们提供了一种使用RegisterInFactory助手类自动注册类的简便方法。

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

1 个答案:

答案 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,单例的使用是偶然的,而不是设计决策。在一篇文章中你可以理解这一点,在这篇文章中你不想写出那些无法达到你要求的东西。