在什么情况下,单例设计模式可能会生成同一单例类的多个实例

In what cases, a singleton design pattern may generate multiple instances of the same singleton class?

本文关键字:单例类 实例 单例 情况下 设计模式 在什么      更新时间:2023-10-16

这是一个面试问题。

在C++中,对于单例设计模式,是否可能存在类的多个实例?如果是,在什么情况下?

我的想法:

在多线程的情况下,如果没有同步保护,我们可能会有多个实例由多个线程生成。

我们可以使用互斥来进行保护。例如,使用互斥锁来保护全局变量作为计数器来保留实例数,以确保只有一个实例。

有更好的主意吗?

在C++11中,有一个新的功能可以使一次性初始化变得可靠-std::call_once。你可以在这里找到一个很好的参考资料。如果你使用的编译器支持C++11,这将为你提供一种很好的独立于平台的标准方法

在依赖于平台的级别,大多数操作系统都提供了一种只进行一次初始化的方法。例如,在iOS或OS X中,您可以使用Grand Central Dispatch的dispatch_once。在Windows上,Vista和更高版本中提供了一次性初始化API。

当你没有标准的替代方案时,这些很好,但多亏了C++11,你不再需要以依赖于平台的方式做那种事情。它非常适合单例初始化。

这可能看起来很明显,但如果您有多个进程,则可以有多极单例实例。我更喜欢java,但如果你有任何与ClassLoader等价的东西,那么你可以再次拥有多个singleton。基本上,您可以拥有与控制实例化的实体一样多的singleton(在这里谈论工厂模式)

在OSX上,不同动态库中的静态对象将是不同的实例。在Windows和Linux上,它们将按预期运行。

在不同平台的进程中拥有唯一静态对象的唯一保证方法是在导出的函数中使用静态局部变量习惯用法,也就是说,而不是这样做:


foo.h

static Foo* global_instance;

foo.cpp

static Foo* global_instance = new Foo();

你需要这样做:


foo.h

Foo* get_global_instance();

foo.cpp

Foo* get_global_instance() {
     static Foo instance;
     return &instance;
    }

显而易见的答案是:这取决于实现,但如果存在多个实例的可能性,实现是破碎的所以这个问题实际上是因为:你会犯什么样的错误实现单例时生成?(答案是:漂亮与实现任何模式时可能出现的错误几乎相同。)

检查双重检查锁定单例模式的问题。这个问题在互联网上流传了很多次。但是我一生中见过的99%的单身汉都使用这种模式:)

好的,这是可能的。在接口上,您有singleton。。。但是在实现中出于任何原因选择了具有多个实例。。也许是联营?

面试问题通常试图测试你对某个主题的了解,通常会有一些技巧。我认为在这种情况下,答案是这样的:如果这个类有不止一个实例,那么它就不是单例模式。