我对设计模式有点不满意。我刚刚开始使用单例,我正在考虑使用一个来方便地将数据存储在一个集中的位置,但在这样做之前,我阅读了一些似乎在说这不是正确的设计的帖子(或者我可能很困惑) ,但不清楚为什么。我想做的是:
将多个对象数组存储在一个集中的位置,以便可以处理对象以实现持久性。
如果不是单例有没有更好的方法来做到这一点?如果这是糟糕的设计,很高兴知道为什么。
我对设计模式有点不满意。我刚刚开始使用单例,我正在考虑使用一个来方便地将数据存储在一个集中的位置,但在这样做之前,我阅读了一些似乎在说这不是正确的设计的帖子(或者我可能很困惑) ,但不清楚为什么。我想做的是:
将多个对象数组存储在一个集中的位置,以便可以处理对象以实现持久性。
如果不是单例有没有更好的方法来做到这一点?如果这是糟糕的设计,很高兴知道为什么。
单例模式的有用性和适用性在很大程度上取决于应用它的环境。
最大的抱怨是基于单例的代码的可测试性。其他抱怨包括它可能在并发环境中出现的潜在问题,以及尝试回收单例拥有的资源时可能面临的困难。
但是,这些问题都不是为 iOS 开发应用程序的主要问题:
由于这些考虑,单例模式成为 iOS 应用程序的流行实现技术。只要你知道它的缺点并愿意与之合作,在你的 iOS 应用中使用单例模式绝对没有错。
许多单例实现都是美化的全局变量。虽然这对于没有编写和维护大量代码的人来说可能看起来不错且方便,但使用全局变量存在许多问题——许多有经验的开发人员和团队禁止使用全局变量。
…将多个对象数组存储在一个集中的位置,以便可以处理对象以实现持久性。
即使是一个全局变量也很痛苦,但是其中的几个数组会产生更大的问题。
问问自己:为什么数组中的所有这些对象都必须始终存在并且可以被程序的任何部分访问?只有部分实现需要它是可见的,并且在某些时候只有某些部分。为什么这些对象数组总是被分配和激活的?创建模型并传递它们,并在需要时将它们作为 ivars 保存。
此外,如果它们被持久化,则不必总是加载它们,因为您可以只在需要时读取/写入所需的内容。
使用全局变量(单例)只会混淆您的对象依赖关系图(糟糕——维护噩梦)。
OP 中没有证据表明您的案件是非典型的。虽然现在看起来是个好主意,但今天的便利在未来往往会付出很多代价。
关于滥用全局变量和单例以及它们引入的问题已经写了很多(在这方面,ObjC 单例/全局与 C、C++ 或 Java 中的实现没有太大区别)。即使是 20 年前的文章仍然会有很好的建议——今天的方程式更加复杂。
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。