由于存在隐藏的依赖关系,难以测试等等,我一直在阅读有关如何使用单例类在编程中成为不良实践的内容。
我读过的很多论坛帖子都说你仍然可以维护单例的主要功能,只允许一个实例而不使用单例模式。
我想知道是否有人可以举一个实际的例子。很多帖子都建议使用工厂类来创建单例实例,其中清楚地显示了依赖关系。对我来说,这似乎只是采取多个单身人士并将它们组合成一个单一的工厂单身人士,这会产生同样的问题吗?
答案 0 :(得分:2)
“单例模式”的问题实际上不是单例本身,而是单例类中不灵活的静态工厂方法。我相信即使在GoF书中,这被认为是如何访问单例的示例,而不是最终的实现模型。
很多帖子建议使用工厂类来创建 单例实例,其中清楚地显示了依赖关系。对我来说 这似乎只是采取多个单身并将它们结合起来 进入单一工厂的单身人士会遇到同样的问题吗?
不同之处在于,这个单一工厂将成为您维护依赖关系的唯一点。
事实上,普遍接受的解决方案是使用依赖注入框架,如Spring或Guice,它基本上是一个单一的工厂,具有非常强大和灵活的配置机制,可以做更多而不仅仅是管理单身人士。
答案 1 :(得分:1)
解决方案通常是使用依赖注入。这并不意味着您必须拥有一个框架,您只需要创建实例并将它们外部连接到主代码库。我使用的模块依赖于其他所有连线和外部配置所有组件的模块(对于其他模块中的组件)
使用依赖注入时,只要创建一个实例,就会有一个单例。
显然,在测试中,您可以创建许多实例,包括子类和接口模拟。
答案 2 :(得分:0)
一个很好的实际例子是springframework。它默认将bean创建为“singleton”(容器中只有一个实例),但不要求程序员实现模式(私有构造函数,getInstance静态方法等)。