需要全局访问时Singleton的替代方案

时间:2011-09-01 09:55:01

标签: oop design-patterns singleton global

我花了最后几个小时阅读单身人士模式以及为什么不使用它,其中包括那些非常好的网站:

我猜你们中有很多人已经知道了这些。

看完我的代码之后,我显然是95%的程序员误解和误用了单例模式.21 在某些情况下,我可以清楚地删除模式,但有些情况下我不确定该怎么做:

我知道接受日志记录的单例是可接受的,其中一个原因是信息只会流入它们但不会返回到应用程序中(当然只是进入日志文件或控制台等)。

那些不符合标准但很多课程需要的课程呢?

例如,我有一个很多类都需要的设置对象。很多,我的意思是200多。

我已经阅读了其他一些SO问题,例如"Singletons: good design or a crutch?",所有这些问题都指出了为什么不鼓励使用单身人士。
我理解其中的原因,但我还有一个主要问题:

如果不使用Singleton模式,如何设计一个需要单个实例的类,可以从任何地方访问?

我能想到的选择是:

  1. 使用静态类(虽然我看不出它会如何更好,看​​看OOP和单元测试)。
  2. 在ApplicationFactory中创建它并在需要它的每个类上执行依赖注入(请记住,在某些情况下它是200+)。
  3. 无论如何都要使用单身人士,因为全球访问奖金超过了该案例的不利之处。
  4. 完全不同的东西。

2 个答案:

答案 0 :(得分:2)

这是否已经被广泛讨论并且令人筋疲力尽?

没有滥用模式。如果您的软件按预期工作(包括可维护性和可测试性),那么您就是单身人士。

人们抱怨的是,单例模式比仅限制一个类有一个实例的影响更大。

  • 你引入了一个全局变量
  • 你不能建立一个子类
  • 您无法重置实例

如果这一切对您来说都不是问题:在整个地方使用单身人士。模式讨论是学术和发型。

并且 - 回答你的问题 - 检查monostate vs singleton线程:Monostate vs. Singleton

答案 1 :(得分:2)

这取决于您对设置对象的确切含义。

所有200个课程都需要所有设置;如果没有,为什么他们可以访问未使用的设置? 设置来自哪里,并且有充分的理由说明为什么每个类都无法在需要时加载其设置?

但最重要的是,不要仅因为代码使用不受欢迎的模式而对工作代码进行更改。我只使用过一次单身模式,但我会再次使用它。

编辑: 我不知道你的约束,但我不担心文件的多次访问,直到它被证明是一个问题。我会将配置拆分为不同类/类组的不同文件,或者最好使用DB而不是具有不同表的文件,为每个类提供数据。

顺便说一句,我注意到,一旦你将数据放入数据库,人们似乎不再担心多次访问它,即使你最后还是要进入文件系统。

PS:如果其他选项不合适,我会使用单例...你希望数据全局可用,你不愿意使用依赖注入,你只希望文件被读取一次;你已经限制了你的选择,而单身人士并没有那么糟糕。

相关问题