单例类与具有静态成员的类

Posted

技术标签:

【中文标题】单例类与具有静态成员的类【英文标题】:Singleton class vs. class with static member 【发布时间】:2012-12-15 09:07:33 【问题描述】:

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

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

我有一个任务队列,我想用它来:

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

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

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

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

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

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

    让任务数组和线程实例都是静态的(按照此处建议的方法:How do I declare class-level properties in Objective-C?)

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

【问题讨论】:

被骗:***.com/questions/519520/… 【参考方案1】:

主要区别很简单,例如:

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

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

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

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

【讨论】:

不过有一个问题:您能否提供一个场景示例,其中为委托和回调传递对象将是有用/必需的,而不是简单地使用静态方法而不必传递任何对象? 您由object.delegate = instance 设置的任何标准可可委托都需要对象的真实实例。在这种情况下,不能使用具有静态方法的类来履行委托的角色。如果你实现了回调/委托机制,那么你总是可以避免需要真实实例。【参考方案2】:

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

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

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

【讨论】:

以上是关于单例类与具有静态成员的类的主要内容,如果未能解决你的问题,请参考以下文章

单例与Java中具有静态成员和方法的类[重复]

请问java 单例类 与 静态类 有何不同?

单例模式全形式

深入理解C# 静态类与非静态类静态成员的区别

静态类和单例模式区别

PHP单例类