为了账号安全,请及时绑定邮箱和手机立即绑定

单身人士:好的设计还是拐杖?

单身人士:好的设计还是拐杖?

holdtom 2019-08-30 16:20:25
单身人士是一个备受争议的设计模式,所以我对Stack Overflow社区对它们的看法感兴趣。请提供您的意见的原因,而不仅仅是“单身人士是懒惰的程序员!”这是一篇关于这个问题的相当不错的文章,尽管它反对使用Singletons: scientificninja.com:performant-singletons。有没有人对他们有任何其他好文章?也许是为了支持单身人士?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

在保护单身人士方面:

  • 它们没有全局变量那么糟糕,因为全局变量没有标准强制的初始化顺序,并且您可以轻松地看到由于天真或意外的依赖顺序而导致的不确定性错误。单身人士(假设他们在堆上被分配)是在所有全局变量之后创建的,并且在代码中的一个非常可预测的位置。

  • 它们对资源惰性/缓存系统非常有用,例如慢速I / O设备的接口。如果您智能地为慢速设备构建单独的接口,并且没有人调用它,那么您将不会浪费任何时间。如果另一段代码从多个位置调用它,您的单例可以同时优化两者的缓存,并避免任何双重查找。您还可以轻松避免单例控制资源上的任何死锁条件。

反对单身人士:

  • 在C ++中,单身后没有很好的自动清理方法。 有一些解决方法和稍微有些方法可以做到这一点,但是没有简单,通用的方法来确保你的单例的析构函数总是被调用。对于这个目的而言,这并不是一个非常可怕的记忆 - 只是将其视为更多的全局变量。但是,如果您的单例分配其他资源(例如锁定某些文件)并且不释放它们,则可能会很糟糕。

我自己的意见:

我使用单身人士,但如果有合理的选择,请避开它们。到目前为止,这对我来说效果很好,而且我发现它们是可测试的,尽管测试的工作稍微多一些。


查看完整回答
反对 回复 2019-08-30
?
慕仙森

TA贡献1827条经验 获得超7个赞

Google有一个针对Java 的Singleton Detector,我认为这个工具必须在Google生成的所有代码上运行。删除单身人士的简单原因:


因为它们可以使测试变得困难并且可以隐藏您的设计问题


有关更明确的解释,请参阅Google的“ 为什么单身人士有争议 ”。


查看完整回答
反对 回复 2019-08-30
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

单身人士只是一件化装的全球变数。

全局变量有它们的用途,就像单身一样,但是如果你认为你正在用单例而不是使用一个令人讨厌的全局变量做一些很酷且有用的东西(每个人都知道全局变量是坏的mmkay),你不幸会被误导。


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信