2012-12-30 44 views
3

我正在构建一个将在主机中使用的插件。这个插件正在使用一个单例服务,我想在任何地方轻松访问。问题出现在我多次实例化同一个插件时,同一个(静态)单例,特定于可运行的,将成为所有实例化插件中的碎片。一般来说,是否有减少单身人士(C++)范围的方法? 由于每个插件本身就是一个实例,我显然可以将插件的根类传递给它的所有子类,但是我希望尽可能保持相同的全局单例设计。避免插件中的单件被所有实例共享

+3

所以你问如何做一个单身的几个副本? :-) –

+0

实际上是将其范围限制为一个插件实例,而不是整个主机应用程序。也许根本没有办法用静态变量来实现这一点,但我想确保。在编写插件时,通常您不希望它与第二个插件共享数据。 –

回答

0

单身人士在内部使用静态变量。 此静态变量的作用域由源文件指定,它由当前的可运行对象定义和分区。由于这些原因,当在同一个主机下运行(然后运行相同的可执行文件)时,两个插件(它们是相同的代码)确实共享相同的静态变量(并且扩展为同一个单例)。 正如我们在这个问题中假设每个插件的代码都是相同的,分割这些单例的唯一方法就是运行一个新的可执行文件。这可以通过使用fork unix命令完成,例如两个进程都会保存自己的内存范围。显然(正如大多数人所评论的),在这种情况下避免使用单例是一种更好的方法,因为分支过程只是增加了无用的复杂性。

3

是否有单身的理由?理由是当你需要强制执行时,只有一个,并且需要提供一个单一的访问点。如果这些不是真正的要求,那么只需创建一个并在需要的地方传递它。

我会逐渐摆脱单身。

单身人士做了很多,还是不多?

您可能需要将它分成几部分。

如果它没有多大作用,只需将它传递到需要的地方,并摆脱它的单身性。

如果它提供了很多服务,请为每个服务创建接口并将它们传递到需要的地方。您的设计将会改进并变得更加易于理解和测试。

首先,接口的实现可以委托给原来的单例,但是你最终想让它们自包含。

+0

好吧我同意这一切,但从技术上讲:我可以想象,分叉进程或运行新的执行将是一种方法来分割这些单身人士。这不是一个好的做法,只是要知道如何在内部运行外部代码,而不会冒险让它们相互覆盖。 –