单例类与静态成员的类

时间:2012-12-31 05:06:03

标签: singleton static-members

尽管有关该主题的许多主题,我仍然不清楚何时选择哪种方法。 我希望通过讨论一个具体的例子,我最终会得到它。"

注意:我的语言是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. 让任务数组和线程实例都是静态的(遵循此处建议的方法:How do I declare class-level properties in Objective-C?

  3. 在这个特定情况下,是否有一种方法比另一种方法更好?如果是这样,为什么?

2 个答案:

答案 0 :(得分:32)

主要区别很简单:

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

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

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

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

答案 1 :(得分:0)

Singleton是一种设计模式,Static是一种 C#关键字,用于使对象成为全局对象。

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

这是一个不错的演示,其中用示例代码说明了差异。 https://www.youtube.com/watch?v=csQdTkEdhME