Answers:
在谷歌测试博客有一系列的关于避免(以创建可测试的代码)辛格尔顿条目。也许这可以帮助您:
上一篇文章详细解释了如何将新对象的创建移入工厂,因此可以避免使用单例。值得一读。
简而言之,我们将所有新运营商移至工厂。我们将寿命相似的所有对象归为一个工厂。
最好的方法是改用Factory模式。当您在工厂中构造类的新实例时,可以将“全局”数据插入到新构造的对象中,以引用单个实例(您将其存储在工厂类中)或通过复制相关实例数据放入新对象。
然后,所有对象都将包含用于单例的数据。我认为总体上并没有太大区别,但这可以使您的代码更易于阅读。
如果使用Spring Framework,则只能创建一个常规bean。默认情况下(或显式设置scope="singleton"
),仅创建一个Bean实例,并且每次在依赖项中使用Bean或通过进行检索时都会返回该实例getBean()
。
您将获得单实例的优势,而无需耦合Singleton模式。
不要累积对单个配置对象的责任,因为它会以难以理解且脆弱的非常大的对象结尾。
例如,如果您需要特定类的另一个参数Configuration
,则可以更改对象,然后重新编译使用该对象的所有类。这有些问题。
尝试重构您的代码,以避免一个通用的全局Configuration
对象。仅将必需的参数传递给客户端类:
class Server {
int port;
Server(Configuration config) {
this.port = config.getServerPort();
}
}
应该重构为:
class Server {
public Server(int port) {
this.port = port;
}
}
一个依赖注入框架将有很大的帮助在这里,但它不是stricly要求。
也许也不是很干净,但是您可以将想要更改的信息传递给创建单例的方法,而不是使用
public static Singleton getInstance() {
if(singleton != null)
createSingleton();
return singleton;
}
}
您可以createSingleton(Information info)
在应用程序启动时直接调用(以及在单元测试的setUp-Methods中)。