【发布时间】:2010-04-15 21:11:37
【问题描述】:
我有一个在整个项目中引用的单例实例,它就像一个魅力。它为我省去了将对象实例传递给项目中每个小类的麻烦。但是,现在我需要管理之前设置的多个实例,这意味着单例模式会中断,因为每个实例都需要它自己的单例实例。
还有哪些选项可以保持对单例的静态访问?更具体地说,我们有我们的游戏引擎和几个组件和插件通过静态属性引用引擎。现在我们的服务器需要托管多个游戏实例,每个实例都有自己的引擎,这意味着在服务器端,单例模式会中断。
我试图避免在构造函数中包含引擎的所有类。
编辑:引擎不能保证在唯一的线程上运行。每个引擎都有一个唯一的 ID,可用于识别实例。
【问题讨论】:
-
只要您使用单例和静态访问,您就必须使用单例的生产版本(紧密耦合)来测试您的类。考虑转向构造函数注入和可选的 DI(依赖注入)容器框架。
-
构造函数注入是我试图避免的。我们有 50 多个类引用引擎,并且必须更改所有构造函数以获取引擎将是大量工作,当静态变量如此接近我们需要时,感觉有点多余。依赖注入可能是答案。我会调查一下。不过看起来工作量很大。
-
修改你的单例以使用唯一 ID 作为键在哈希表中查找值。
-
Westgate,所有想要引用单例对象的对象都需要知道该键,从而再次强制所有对象在某些情况下将相同的对象(在本例中为键)作为参数点。
-
如果重构开销是修改所有构造函数的主要问题,您可能需要查看 Resharper 之类的重构工具。对于每个类,您只需单击 Singleton.Instance 调用,然后单击 Refactor |引入 Field 并替换所有出现的地方。它将引入一个在构造函数中设置的新私有字段。现在只需要将隔离的 Singleton.Instance 调用改为通过构造函数传递的参数,也就是 Refactor |引入参数。现在所有的构造函数调用都会有一个虚拟对象,编译器会在构建时指出它。