【问题标题】:Alternatives to Singleton when global access is wanted需要全局访问时的单例替代方案
【发布时间】:2011-09-01 09:55:00
【问题描述】:

在过去的几个小时里,我一直在阅读有关单例模式以及为什么不使用它的信息,以及其他一些非常好的网站:

我想你们很多人已经知道这些了。

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

我知道单例日志是被接受的,原因之一是信息只流入它们而不返回应用程序(当然只是流入日志文件或控制台等)。

其他不符合该标准但很多课程都需要的课程呢?

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

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

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

我能想到的选项是:

  1. 改用静态类(虽然我看不出这会更好,看看 OOP 和单元测试)。
  2. 在 ApplicationFactory 中创建它并对每个需要它的类执行依赖注入(请记住,在某些情况下它是 200+)。
  3. 无论如何都要使用单例,因为全局访问红利超过了这种情况下的劣势。
  4. 完全不同的东西。

【问题讨论】:

  • 我投票给#2 和/或#3,因为我也没有最终答案。好的 #4 也是一个选项 :-)

标签: oop design-patterns singleton global


【解决方案1】:

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

是否所有 200 个类都需要所有设置;如果不是,为什么他们可以访问未使用的设置? 设置从何而来?每个类无法在需要时加载其设置是否有充分的理由?

但最重要的是,不要仅仅因为代码使用了令人不悦的模式就对工作代码进行更改。我只使用过一次单例模式,但我会再次使用它。

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

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

PS:如果其他选项不合适,我会使用单例...您希望数据全局可用,您不愿意使用依赖注入,您只希望文件被读取一次;你限制了你的选择,单身也不错。

【讨论】:

  • 设置来自单个配置文件,所以我认为让一个类只读取该文件一次是最好的方法。我想我宁愿只访问一个文件,而不是让每个班级都读取他们自己从文件中读取的设置,但请随时提出更好的选择
  • 作为一个侧节点,代码在某些方面确实不是那么可读和易于理解。主要原因是它是由大约 10 位不同的程序员创建的,其中 3 位不再在这家公司工作。由于我们需要建立一个基于该项目的新项目,我正在尝试重组旧项目,然后再将相同的问题带入新项目
  • 设置对象读取用户可编辑的 .INI 文件,因此我无法将其存储在数据库中。不过,我确实有一个数据库来满足我的其他需求。
【解决方案2】:

这不是已经广泛讨论过了吗?

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

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

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

如果这一切对您来说都不是问题:到处使用单例。模式讨论是学术性的,令人费解。

并且 - 回答您的问题 - 查看单态与单态线程:Monostate vs. Singleton

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2021-03-05
    相关资源
    最近更新 更多