c++ - GenericFactory 作为单例

标签 c++ singleton generics factory

我读了文章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/

相关文章:

java - 使用 Observable 单例类来处理网络调用不好吗?

java - 无法打破经典的延迟初始化单例

java - 我可以添加到扩展 A 的类型 B 的类型 A 值的通用集合中,而不需要任何特殊语法吗?

ios - Objective-C 泛型-安全数组/字典字面量

c++ - 模板参数推导没有按预期工作

c# - Ninject 单例未作为单例注入(inject)依赖类

php调用c++套接字函数导致权限被拒绝错误

c# - 用逗号连接字符串以加入长字符串

c++ - 如何使用对未知大小数组的引用来调用函数?

c++ - 在整数数组中连续输入