单身人士与代表:好主意还是坏主意?

时间:2012-01-31 22:28:35

标签: objective-c delegates singleton cocoa-design-patterns

我创建的对象是Web服务的接口。一个典型的对象是" TaskService"。当客户端使用其中一个对象时,它会调用其中一个服务的方法(例如" GetTasks"),该服务将异步关闭以调用远程Web服务,并回发通过代表检索数据。

目前,要使用其中一个服务,您必须使用[[TaskService alloc] init]创建它,但我认为将每个服务转换为单个对象更有意义。

看到包含对委托的引用的单例对象是否常见?我设计的主要问题是每个对象,无论何时需要使用特定服务,都必须在调用服务之前将自己设置为委托,这对我来说似乎不对...如果另一个对象是将自己设置为委托,并将自己设置为委托并调用服务?

非常感谢提前!

此致 尼克

4 个答案:

答案 0 :(得分:4)

因为你引用的原因,这不是一个好主意。 Singleton模式实际上只适用于其中一种,但听起来您的应用程序可能需要这些服务的多个实例。当你真的需要实例化服务的多个实例时,我认为你最终会解决这个问题(使用操作队列或某种委托多路复用器)。

答案 1 :(得分:4)

当场合保证使用Singleton对象时,我总是因为你引用的原因而避免委托。单身的消费者如果通过将自己设定为单身人士的唯一代表而踩到其他消费者的脚趾上,就无法知道(没有一些丑陋的编码)。 NSNotifications是一个更清洁的工具;任意数量的听众都可以使用通知,而无需关心其他人可能正在倾听。

当类之间有明确的所有权时,委派最有效。没有人拥有单身人士。

答案 2 :(得分:0)

Singleton不是真正的问题,只需实例化一个类并将其作为全局变量传递,就会导致同样的问题。 正如其他人所提到的那样,队列是可能的,或者当你在Singleton中调用服务上的任务时,实例会有一个TaskRequest对象传递给方法和回调委托,这样请求就不会互相践踏。事实上,无论如何最好使用队列来做这件事。

答案 3 :(得分:0)

单身人士的范围是整个申请。例如:让我们考虑购物应用程序记录器数据的示例,关于需要在应用程序的不同部分访问的用户ID,如订单,付款,购物车等。

代表用于1对1通信,例如:您可以举例如您有两类电视和遥控设备。你想改变电视频道。用于改变频道的电视的委托方法在遥控设备类中实现。因此,您使用遥控设备并更改电视频道。

单例用于与多个接收器通信,而委托模式通常用于1对1通信。