10

尽管关于该主题的主题很多,但我仍然不清楚何时选择哪种方法。我希望通过讨论一个具体的例子,我最终会“明白”。

注意:我的语言是 Cocoa,尽管一般问题不是特定于语言的。

我有一个 TaskQueue 类,我想用它来:

  • 从我的代码中的任何地方访问以添加或删除计划任务
  • 定期自动处理计划任务

首次使用 TaskQueue 时,我希望 TaskQueue 启动一个线程,然后定期唤醒以处理任务。

显然,我至少需要两个变量:

  • 存储任务的数组
  • 处理任务的线程实例

由于我只想要一个任务队列和一个线程来处理这些任务,我有两种选择:

  1. 使 TaskQueue 成为单例类(例如使用http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html中所述的 CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR ,我相信我将不得不修改 CWLSynthesizeSingleton。 h 文件以在初始化时启动线程。)

  2. 任务数组和线程实例都是静态的(按照此处建议的方法:如何在 Objective-C 中声明类级属性?

在这种特定情况下,显然有一种方法比另一种方法更好吗?如果是这样,为什么?

4

2 回答 2

34

主要区别很简单,例如:

  • 使用单例,您可以为委托和回调传递对象
  • 使用单例,您可以实现接口并派生它
  • 使用单例,您可以使用工厂模式来构建您的实例

如果您不需要它们中的任何一个,例如必须在代码周围访问的全局功能,那么您可以使用静态方法。

我个人更喜欢使用静态方法,除非我有明确的理由使用单例实例(例如具有通用接口但实现不同)。

请注意,将静态方法重构为单例实例是一个非常简单的过程,因此,如果您发现需要后者,您将轻松重构它(然后您有 C 预处理器,一个#define几乎就足够了)。

于 2012-12-31T05:11:01.750 回答
0

Singleton 是一种设计模式,Static 是使对象全局化的C# 关键字。

单例 = 静态 + 线程安全 + 延迟加载 + 迭代器模式

这是一个很好的演示文稿,其中用示例代码解释了差异。 https://www.youtube.com/watch?v=csQdTkEdhME

于 2020-07-31T13:02:09.357 回答