单例类与静态成员的类

Lol*_*olo 10 singleton static-members

尽管有关该主题的许多主题,我仍然不清楚何时选择哪种方法.我希望通过讨论一个具体的例子,我终于"明白了".

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

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

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

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

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

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

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

  1. 做任务队列一个单独的类(如描述例如使用CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html,我相信我将不得不修改CWLSynthesizeSingleton. h文件在初始化时启动线程.)

  2. 让任务数组和线程实例都是静态的(遵循这里建议的方法:如何在Objective-C中声明类级属性?)

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

Jac*_*ack 32

主要区别是简单的事情,如:

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

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

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

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

  • 但是有一个问题:你能提供一个场景示例,其中传递委托和回调的对象是有用的/需要的,而不是简单地使用静态方法而不必传递任何对象吗? (2认同)
  • 由`object.delegate = instance`设置的任何标准cocoa委托都需要一个对象的实例.在这种情况下,不能使用具有静态方法的类来履行委托的角色.如果您实现了回调/委托机制,那么您始终可以避免使用实际实例. (2认同)