我正在构建一个将在主机中使用的插件。这个插件使用单例来提供我想在任何地方轻松访问的服务。问题来自于我多次实例化相同的插件,相同的(静态)单例,特定于runnable,将是所有实例插件中的分片。一般来说,有没有办法减少单例(c ++)的范围? 由于每个插件本身就是一个实例,我显然可以将插件的根类传递给它的所有子类,但我希望尽可能保持相同的全局单例设计。
答案 0 :(得分:3)
有单身人士的理由吗?理由是当您需要强制执行只有一个,并且需要提供单一访问点时。如果这些不是真正的要求,那么只需创建一个并在需要的地方传递它。
我会逐渐摆脱单身人士。
单身人士做了很多,或者做得不多?
您可能需要将其分成几部分。
如果它没有做太多,只需将它传递到需要的地方,并摆脱它的单身。
如果它提供了大量服务,请为每个服务创建接口,并将它们传递到需要它们的地方。您的设计将得到改进,变得更易于理解,更易于理解。
首先,接口的实现可以委托给原始单例,但是你想最终使它们自包含。
答案 1 :(得分:0)
单身人员在内部使用静态变量。 此静态变量的范围由源文件指定,在该文件中,它由当前的runnable定义和分区。出于这些原因,当在相同的主机(然后是相同的runnable)下运行时,两个插件(它们是相同的代码)确实共享相同的静态变量(并且通过扩展名相同的单个)。 正如我们在这个问题中假设每个插件的代码相同,分割这些单例的唯一方法就是运行一个新的可执行文件。这可以使用fork unix命令完成,例如,两个进程将保持自己的内存范围。 显然(正如大多数人所评论的那样)在这种情况下避免使用单例是一种更好的方法,因为分支过程只会增加无用的复杂性。