3

我对设计模式有点不满意。我刚刚开始使用单例,我正在考虑使用一个来方便地将数据存储在一个集中的位置,但在这样做之前,我阅读了一些似乎在说这不是正确的设计的帖子(或者我可能很困惑) ,但不清楚为什么。我想做的是:

将多个对象数组存储在一个集中的位置,以便可以处理对象以实现持久性。

如果不是单例有没有更好的方法来做到这一点?如果这是糟糕的设计,很高兴知道为什么。

4

3 回答 3

5

单例模式的有用性和适用性在很大程度上取决于应用它的环境。

最大的抱怨是基于单例的代码的可测试性。其他抱怨包括它可能在并发环境中出现的潜在问题,以及尝试回收单例拥有的资源时可能面临的困难。

但是,这些问题都不是为 iOS 开发应用程序的主要问题:

  • 您的应用程序中的模型通常只有一个单例;您可以使其可交换以确保可测试性,例如通过读取类的名称以从运行时配置实例化,或从运行时环境中推导出它。
  • 尽管 iOS 应用程序使用并发结构,但它们大部分是单线程的。
  • iOS 应用程序一直运行到最终用户杀死它们,此时操作系统会自动回收资源;杀死单身人士并不存在特定问题。

由于这些考虑,单例模式成为 iOS 应用程序的流行实现技术。只要你知道它的缺点并愿意与之合作,在你的 iOS 应用中使用单例模式绝对没有错。

于 2013-08-01T02:51:30.337 回答
3

许多单例实现都是美化的全局变量。虽然这对于没有编写和维护大量代码的人来说可能看起来不错且方便,但使用全局变量存在许多问题——许多有经验的开发人员和团队禁止使用全局变量。

…将多个对象数组存储在一个集中的位置,以便可以处理对象以实现持久性。

即使是一个全局变量也很痛苦,但是其中的几个数组会产生更大的问题。

问问自己:为什么数组中的所有这些对象都必须始终存在并且可以被程序的任何部分访问?只有部分实现需要它是可见的,并且在某些时候只有某些部分。为什么这些对象数组总是被分配和激活的?创建模型并传递它们,并在需要时将它们作为 ivars 保存。

此外,如果它们被持久化,则不必总是加载它们,因为您可以只在需要读取/写入所需的内容。

使用全局变量(单例)只会混淆您的对象依赖关系图(糟糕——维护噩梦)。

OP 中没有证据表明您的案件是非典型的。虽然现在看起来是个好主意,但今天的便利在未来往往会付出很多代价。

关于滥用全局变量和单例以及它们引入的问题已经写了很多(在这方面,ObjC 单例/全局与 C、C++ 或 Java 中的实现没有太大区别)。即使是 20 年前的文章仍然会有很好的建议——今天的方程式更加复杂。

于 2013-08-01T03:17:23.253 回答
0

I agree with justin a great deal since the habit is transferrable to other languages. I would just like to add that when considering a singleton ask yourself the question "How will my application benefit by using only one instance of this class?" I'm not the most experienced programmer in the world but I have yet to find any good reason to create a Singleton. Additionally, most frameworks already come with rationally implemented Singletons, such as those that access files/directories (e.g. [NSFileManager defaultManager]). Even then, Apple suggests:

"If you plan to use a delegate with the file manager to receive notifications about the completion of file-based operations, you should create a new instance of NSFileManager (using the init method) rather than using the shared object."

如果您有任何疑问,则该课程应该是 Singleton。

于 2013-11-27T23:41:12.010 回答