2012-12-31 57 views
9

尽管该主题有许多线索,但我仍不清楚何时选择哪种方法。 我希望通过讨论一个具体的例子,我会最终“明白”。单身人士班级与静态会员班级

注:我的语言在这里是可可,尽管一般问题不是语言特定的。

我有,我想用一类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. 有任务和线程的阵列例如两者是静态的(做法以下建议位置:How do I declare class-level properties in Objective-C?

是否有明确的一种方法,它比其他人在这个特定情况下更好?如果是这样,为什么?

+0

duped:http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?lq=1 – cregox

回答

29

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

  • 与一个单身,你可以四处为代表和回调
  • 的对象传递与一个单身,你可以实现接口,并得出其
  • 用单你可以使用工厂模式来建立你的实例

如果你不需要它们中的任何一个,就像全局功能必须被全部访问一样你的代码,然后你可以去静态方法。

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

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

+0

清晰简洁。谢谢。 – Lolo

+2

虽然有一个问题:你能否提供一个场景的例子,其中传递委托和回调的对象是有用/必需的,而不是简单地使用静态方法,而不必传递任何对象? – Lolo

+2

您通过'object.delegate = instance'设置的任何标准可可代理都需要一个对象的实例。具有静态方法的类不能用于这种情况下来履行委托的角色。如果您实现了回调/委托机制,那么您始终可以避免实际需要。 – Jack