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

2024-02-14

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

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

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

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

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

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

  • 一个数组来存储任务
  • 处理任务的线程实例

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

  1. 使 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 文件才能在初始化时启动线程。)

  2. 让任务数组和线程实例都是静态的(遵循此处建议的方法:如何在 Objective-C 中声明类级属性? https://stackoverflow.com/questions/695980/how-do-i-declare-class-level-properties-in-objective-c)

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


主要区别很简单,例如:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单例类与具有静态成员的类 的相关文章

  • 如果存在依赖,编译器能否正确处理静态变量的初始化顺序?

    如果存在依赖 编译器能否正确处理静态变量的初始化顺序 例如 我有 a h struct A static double a a cpp include a h double A a 1 b h struct B static double
  • 对 static constexpr char[] 的未定义引用

    我想要一个static const char我班上的数组 GCC 抱怨并告诉我我应该使用constexpr 尽管现在它告诉我这是一个未定义的引用 如果我将数组设置为非成员 那么它就会编译 到底是怎么回事 hpp struct foo voi
  • 如何避免一遍又一遍地创建同一个对象?

    如前所述 我继续研究我的 TCP 套接字今天早上 https stackoverflow com questions 74812333 我发现每次我通过这样的套接字发送消息时 套接字的数量都会不断增加 这仅仅意味着我不断创建和打开新的套接字
  • 单例类方法的并发调用

    我有一个单例类 public class Singleton private static Singleton istance null private Singleton public synchronized static Single
  • Ruby 中的 class << self 习惯用法

    什么是class lt lt self do in Ruby 首先 class lt lt foo语法打开foo的单例类 eigenclass 这允许您专门化在该特定对象上调用的方法的行为 a foo class lt lt a def i
  • deepcopy 不尊重元类

    我有一堂课 根据设计 必须遵循单例图案 所以我继续使用元类 一切都运行良好 直到报告了一个错误 总而言之 deepcopy ied 我的实例单例类不是相同的实例 我可以通过从基础继承来解决这个错误单例 type 类 但我宁愿不这样做 原因在
  • 使用 AtomicReference 的单例

    使用 AtomicReference 的延迟初始化单例是否正确实现 如果不是 可能的问题是什么 import java io ObjectStreamException import java io Serializable import
  • 如何实例化对象的静态向量?

    我有一个 A 类 它有一个静态对象向量 对象属于 B 类 class A public static void InstantiateVector private static vector b vector of B 在函数 Instan
  • python:具有多态性的类属性/变量继承?

    在我作为一名 python 学徒的努力中 如果我尝试使用类属性 我最近会陷入一些奇怪的 从我的角度来看 行为 我不是在抱怨 但希望能提供一些有用的评论来阐明这个问题 为了将复杂的问题简化为更简洁的问题 我会这样表述 确保类属性的行为更像继承
  • 使用 CRTP 实现单例

    看完之后这个答案 https stackoverflow com a 4173298 7151494我尝试过实现一些简单的 CRTP 用法 我想我会尝试实现 Singleton 是的 我知道 这只是为了练习和研究 模式 因为链接的答案kin
  • 如何在仅标头库中拥有静态数据成员? [复制]

    这个问题在这里已经有答案了 在非模板化库类中拥有静态成员的最佳方法是什么 而不将定义成员的负担强加给类用户 假设我想提供这个课程 class i want a static member static expensive resource
  • Android 中的静态单例生命周期

    我有一些不清楚的情况 最后一个持有 Activity 的引用被销毁后 静态单例会被垃圾回收吗 因为Application中没有更多对单例实例的引用 那么我可以依赖单身人士吗 由官方提供安卓文档 http developer android
  • 声明静态成员的类装饰器(例如,对于 log4net)?

    我正在使用 log4net 我们的代码中有很多这样的内容 public class Foo private static readonly ILog log LogManager GetLogger typeof Foo 一个缺点是 这意味
  • ASP .NET 单例

    只是想确保我在这里没有假设一些愚蠢的事情 在 ASP Net Web 应用程序中实现单例模式时 静态变量范围仅适用于当前用户会话 对吧 如果第二个用户正在访问该站点 那么它是不同的内存范围 静态成员仅具有当前工作进程的作用域 因此与用户无关
  • 如何在c#中创建一个完美的Singleton类?

    我想用 Singleton 类存储一些数据 据我研究 单例类只能实例化一次 但这对我不起作用 有人可以更正我的代码吗 public class MvcApplication System Web HttpApplication Single
  • Dagger 2 - 如何创建/提供 EagerSingleton

    我在使用 Dagger 2 依赖注入框架时遇到问题 我想创建一个渴望单例 我假设当我使用 dagger 2 时会创建延迟加载的单例 Singleton注解 我如何创建渴望单例使用 Dagger 2 框架 我通过创建一个解决了这个问题Eage
  • 如何避免c#中windows窗体的多个实例

    如何避免在 C 中出现多个 Windows 窗体实例 我只想运行该表单的一个实例 因为有机会从我的申请的许多页面打开相同的表格 是的 它有单例模式 创建单例对象的代码 public partial class Form2 Form priv
  • 静态类属性上的 isset

    class A public static foo 42 class A attribute foo var dump isset class attribute gives bool false 我如何检查这个类中是否存在这个静态属性 U
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 我可以通过在 Android Activity 中声明适当的成员“静态”来提高效率吗

    如果一个 Activity 在实践中是单例 我认为我可以通过声明适当的成员 静态 来获得一些效率 且风险为零 是的 The Android 文档说 http developer android com guide topics fundam

随机推荐

  • Android Lollipop 中是否可能有一个不共存的“个人资料所有者”应用程序

    Lollipop API 提供了 2 个新功能 配置文件所有者 和 设备所有者 http developer android com about versions android 5 0 html Enterprise http devel
  • Spring-MVC控制器中触发404?

    我如何获得Spring http en wikipedia org wiki Spring Framework3 0控制器触发404 我有一个控制器 RequestMapping value method RequestMethod GET
  • Android 的氛围

    首先 我打算使用气氛 https github com Atmosphere atmosphere在服务器端和客户端都有一个带有 WebView 的 Android 应用程序 我将在其中使用 jQuery 但是 稍后计划推出更 标准 的 A
  • SSRS 包含或类似表达式

    我正在尝试从数据集中的字段创建计算表达式 我需要从一个字段中查找包含 交易所交易 一词的所有内容 并且在我的新字段中包含 ETF 13F 一词 如果没有任何匹配 那么它就只是空白 我已经尝试过喜欢 交易所交易 并包含 交易所交易 函数 并且
  • 使用进程生成器或 apache commons exec 执行外部程序

    我需要执行一个外部应用程序 该应用程序返回大量数据 需要 2 个多小时才能完成 并且连续输出数据 我需要做的是异步执行该程序并将输出捕获到文件中 我尝试使用 java process builder 但是它似乎仅在程序退出或强制终止时才挂起
  • 使用 JSF 验证更改 CSS 样式

    我正在研究在 JSF 服务器端验证后以红色突出显示失败的字段的要求 无法使用 javascript 进行验证 有没有一种方法可以将服务器端验证与 css 样式更改链接起来 您可以使用托管 bean 来执行此操作 public class V
  • Laravel Backpack - 显示关系函数中的特定属性

    我已经注册了Comment模型有一个User参考 像这样 public function user return this gt belongsTo App User 该函数返回一个实例User 这是正确的 但我不知道如何注册User列获取
  • jquery 捕获单词值

    有没有办法用 jquery 或 javascript 捕获单词值 在示例中 搜索 五月行情 当我单击 搜索 或 引号 或任何单词时 我会提醒该单词文本吗 Update 这就是我的意思 http jsfiddle net BE68L http
  • 动态代码生成

    我目前正在开发一个应用程序 您可以用它创建 程序 而无需编写源代码 如果您愿意 只需单击并播放即可 现在的问题是如何从我的数据模型生成可执行程序 有很多种可能性 但我不确定哪一种最适合我 我需要生成包含类和命名空间以及可以成为应用程序一部分
  • 谷歌应用程序脚本桌面IDE [重复]

    这个问题在这里已经有答案了 我喜欢将 Google Sheets 与应用程序脚本一起使用 但在线脚本 IDE 很麻烦 滞后 等 并且没有桌面 IDE 的许多便利 希望谷歌能在某个时候推出桌面IDE 有人知道制作 Google 应用程序脚本的
  • 传单中的javascript地图如何刷新

    我通过使用传单 API 在 javascript 中有一个基本的 geoJson 程序 div style width 100 height 400px div
  • 在 Laravel 8 中捕获 HTTP 客户端错误

    你如何捕捉抛出的错误HTTP客户端 https laravel com docs 8 x http client 例如超时 以便在您可以对错误执行任何操作以避免停止执行之前 它不会在 Laraval 调试器 在调试模式下 中抛出curl 错
  • 表视图中的文本标签太长,会影响正确的详细信息(detailTextLabel)被覆盖或不显示

    我已经为该单元格设置了一个文本 但是 它显示的文本太长 这会影响正确的详细文本被覆盖或不显示 我无法更改它 因为我需要下一个视图控制器中的名称 是否可以使其仅显示文本 后跟 EXAMPLE 电气电子工程 01 gt 传奇 Electrica
  • 如何在插件架构中做到免注册COM

    我们使用清单文件来实现免注册 COM 正如我在这另一个问题 https stackoverflow com questions 465882 generate manifest files for registration free com
  • 在哪里添加 String 原型

    我目前正在 Titanium Studio 中使用 JavaScript CommonJS 并且有一个关于原型设计的问题 假设我想向现有的类添加一个新函数 例如 String prototype trim function return t
  • 运行应用程序中的 Grails 3.0 静态 html

    之前曾就 grails 2 3 4 提出过类似的问题 我觉得很奇怪 我找不到一种方法来做到这一点 因为这对我来说似乎是一个标准用例 我只是想在运行 grails run app 时提供 html 页面 包括它们链接的 css 和 js An
  • 使用 asyncio 并行化生成器

    我的应用程序从慢速 I O 源读取数据 进行一些处理 然后将其写入本地文件 我已经用生成器实现了这个 如下所示 import time def io task x print requesting data for input s x ti
  • 您能否返回适用于任何可能的错误类型的结果?

    我想使用多个库 每个库都有自己的错误类型 我并不真正关心每个特定板条箱的错误类型 我想使用 习惯用法是使用那些返回 a 的 crate 的方法Result type 我也不想解开这些值 如果遇到错误 这会导致恐慌 我可能只是想使用传播不同的
  • 光滑的旋转木马 - 强制幻灯片具有相同的高度

    我在使用 Slick carousel JS 插件时遇到了多个问题幻灯片显示它们具有不同的高度 我需要幻灯片相同高度 但是对于 CSS flex box 它不起作用 因为幻灯片具有冲突的 CSS 定义 另外 我在论坛和网络上没有找到任何有用
  • 单例类与具有静态成员的类

    尽管关于该主题的主题有很多 但我仍然不清楚何时选择哪种方法 我希望通过讨论一个具体的例子 我最终能 明白 注意 我这里的语言是 Cocoa 尽管一般问题不是特定于语言的 我有一个类 TaskQueue 我想用它来 从我的代码中的任何位置访问