3

我在这个网站上看到了很多“单身人士是邪恶的”。这几乎让我相信单身人士是病态的骗子。但是,如果是真的,为什么可可中有这么多单例?像 shareApplication、shareManager 等等。我想知道如果我不使用单例模式,我怎么能做同样的事情。例如,确保只有一个实例并在我需要时访问它。

所以我会怀疑这句话,直到我能找出更好的方法。

请帮我。谢谢

4

3 回答 3

3

没有一个特征或模式本质上是邪恶的。Evengoto有它的用途,有时可以提高可读性。“单例是邪恶的”源于许多新手开发者容易误用它们的事实。所以这是一个常识,有时常识不是最好的解决方案。

在您的示例shared...中,技术上不是单例。您可以创建数千个实例UIApplicationNSFileManager同时创建。它们更像是服务定位器(“查找我的应用程序”、“查找我的默认文件管理器”)。这些方法为我们提供了一些有用的共享值,我们需要 99% 的时间。尽管这会使单元测试变得更加困难,但这样做的好处是值得的。

于 2012-11-09T10:51:10.073 回答
0

Cocoa 中有如此多的单例,因为它的设计早在对所有遇到问题的事物都宣布“邪恶”和“被认为有害”很酷之前就已经设计好了。

单身人士并不完全是邪恶的。如果使用得当,它们在许多情况下都能很好地工作。您已经发现了与它们相关的问题,但这并不意味着您必须立即摆脱它们,否则世界将终结。有些项目的实际情况是这样的,所以你永远不会遇到单例的问题。

显然,当它们已经存在时,您无法避免使用库单例。每当您需要某个对象,例如 NSApplication 或 NSWorkspace 时,您应该使用它们的 sharedApplication/sharedWorkspace 方法,这就是系统框架的设计方式。

在设计自己的代码时,您可以确保对象仅由工厂创建,而不是单例,并以某种方式对一些工厂方法进行编码,以便在之前请求此类对象时它们返回先前的实例。这种设计避免了全局和单例的典型缺点,即无法用模拟代替它们。

于 2012-11-09T11:11:51.850 回答
0

单例通常有助于存储您的全局数据。

然而,单例通常只是用作各种随机方法和变量的垃圾场,没有任何顺序或理由。

http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx

这可能就是人们不喜欢使用 Singleton 的原因。

如果您不以混乱的行为滥用 Singleton,那么在我看来,您不应该避免使用它。

于 2012-11-09T10:47:52.103 回答