我正在使用MVC设计模式创建一个简单的应用程序,我的模型从Web访问数据并使其可供我的控制器用于后续显示。
经过一番研究后,我决定将一个方法作为单例实现,以便我可以从任何控制器中将其作为共享实例访问。
说过我读的单身人士越多,我就会越多地注意到人们说很少有更好的解决办法是不可能的。
如果我不使用单身人士,我会对可能创建模型类的地方感到困惑。我对通过appDelegate进行此操作并不满意,并且将它放在任何viewControllers中似乎都不可行。
任何评论或指示都会非常感激。
EDIT_001:
TechZen,非常感谢(一如既往的精彩回答)我可以在接受之前再添加一个问题。当应用程序退出时,您对释放单例的想法是什么?我不确定这有多重要,因为我经常知道对象deallocs不会被应用程序拆除调用,因为它们将在应用程序退出时被清除。显然我可以用NSApplicationWillTerminateNotification注册共享实例,这值得做,只是好奇吗?
加里
答案 0 :(得分:8)
对单身人士的使用有很多阻力,因为他们经常被滥用。懒惰的编码器要么(1)没有在单例中放置足够的功能,这导致逻辑在其他对象(例如意大利面条)中展开,或者(2)它们投入了很多功能,使得单例成为整个程序。懒惰的编码器经常使用单例而不是进行数据验证,对象测试和对象跟踪。人们厌倦了尝试解开并保持懒惰的单身人士使用,所以他们试图压制单身人士的使用。
我完全理解这种冲动,我自己也在仪式上警告不要滥用单身人士。
但是,数据模型是单身人士的少数合法用途之一。在像移动设备上运行的小应用程序中尤其如此。最后,您将为数据模型使用单例,或者将其附加到单例。
例如,假设您决定将非单一数据模型对象停放在应用程序委托中。好吧,你已经完成了这个:dataModel - > appDelegate - > application(singleton)。要访问它,您可以致电:
[[[UIApplication sharedApplication (a singleton)] delegate] theDataModelObj];
即使你像对象一样将对象传递给对象,你仍然必须将dataModel obj作为单例的属性开始。
当一个物体真的必须符合“Highlander”模式(“只能有一个!”)时,单身是最好的选择。除了应用程序对象之外,您还有用户默认值作为单例以及文件管理器。显然,在所有三种情况下,您需要整个应用程序存在一个且仅存在一个实例。例如,如果您有多个用户默认对象,则您的应用程序将是一个试图跟踪所有首选项设置的火车残骸。如果您有多个文件管理器,则文件操作可以相互依赖。
正确设计的用户数据模型只是用户默认值的较大版本。它应该是直接操纵用户数据的唯一对象。应用程序中没有其他对象至少应该具有该任务。这使得单例设计模式成为在这种特殊情况下使用的最佳设计模式。
单身人士是一个非常强大的工具,但就像物理工具一样,他们给你的力量越大,如果你不小心使用它们,它们为你创造的机会就越多。因此,单身人士很少是您的首选。通常有更好的设计模式。
然而,当你真的需要一个单身人士时,你不应该回避使用它们只是因为其他人的懒惰给了他们一个不好的代表。
知道何时何时不使用强大而危险的工具是程序员直觉的一部分,您可以根据经验开发。你不能按公式去做。这是使编码成为一门艺术并且程序员成为工匠的那些因素之一。