gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:50:50 24 4
gpt4 key购买 nike

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

注意:虽然一般问题不是特定于语言的,但我这里的语言是 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?)

在这种特定情况下,是否有一种方法明显优于另一种方法?如果是这样,为什么?

最佳答案

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

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

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

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

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

关于单例类与具有静态成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com