尽管关于该主题的主题有很多,但我仍然不清楚何时选择哪种方法。
我希望通过讨论一个具体的例子,我最终能“明白”。
注意:我这里的语言是 Cocoa,尽管一般问题不是特定于语言的。
我有一个类 TaskQueue 我想用它来:
- 从我的代码中的任何位置访问以添加或删除计划任务
- 定期自动处理计划任务
当第一次使用TaskQueue时,我希望TaskQueue启动一个线程,然后该线程会定期唤醒以处理任务。
显然,我至少需要两个变量:
由于我只想要一个任务队列和一个线程来处理这些任务,所以我有两种选择:
使 TaskQueue 成为单例类(例如使用 CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR 中所述)http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html,我相信我必须修改 CWLSynthesizeSingleton.h 文件才能在初始化时启动线程。)
让任务数组和线程实例都是静态的(遵循此处建议的方法:如何在 Objective-C 中声明类级属性? https://stackoverflow.com/questions/695980/how-do-i-declare-class-level-properties-in-objective-c)
在这种特定情况下,是否有一种方法明显优于另一种方法?如果是这样,为什么?
主要区别很简单,例如:
- 使用单例,您可以传递委托和回调的对象
- 使用单例,您可以实现接口并派生它
- 对于单例,您可以使用工厂模式来构建您的实例
如果您不需要其中任何一个,就像必须在代码中访问的全局功能一样,那么您可以使用静态方法。
我个人更喜欢使用静态方法,除非我有明确的理由使用单例实例(例如具有公共接口但不同的实现)。
请注意,将静态方法重构为单例实例是一个非常简单的过程,因此如果您发现需要后者,您将轻松重构它(然后您就有了 C 预处理器,一个单一的#define
几乎就足够了)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)