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

Posted

技术标签:

【中文标题】带代表的单身人士:好主意还是坏主意?【英文标题】:Singleton with a delegate: Good idea or bad? 【发布时间】:2012-01-31 22:28:35 【问题描述】:

我创建了作为 Web 服务接口的对象。一个典型的对象是“TaskService”。当客户端使用这些对象之一时,它会调用服务的方法之一(例如“GetTasks”),服务将异步开始调用远程 Web 服务,并通过委托回发检索到的数据。

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

是否经常看到持有对委托的引用的单例对象?我对设计的主要问题是,每个对象,无论何时需要使用特定服务,都必须在调用服务之前将自己设置为委托,这对我来说似乎不太正确......如果另一个对象怎么办在将自己设置为代理和调用服务之间,是否要将自己设置为代理?

非常感谢!

问候, 尼克

【问题讨论】:

【参考方案1】:

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

【讨论】:

我不知道什么是委托多路复用器(某种广播?),但这听起来对我来说太复杂了,无法尝试和实现,所以我会尽量避免这样的事情!要实现操作队列,我认为每个方法都必须将委托/参数作为参数是正确的吗?所以“请​​求”可以排队,一旦完成就可以调用相关的委托? 委托多路复用器是我刚刚为您在单例中编写的代码而编造的一个术语,用于确定将任何给定结果发送到哪个委托。 op que 会更好地封装每个操作(委托的获取和通知)。所以是的,请求将以这种方式排队。【参考方案2】:

当场合需要使用单例对象时,出于您引用的原因,我总是避免委托。单例的消费者无法知道(没有一些丑陋的编码)他们是否通过将自己设置为单例的唯一代表而踩到了其他消费者的脚趾。 NSNotifications 是一个更清洁的工作工具;任意数量的侦听器都可以使用通知,而无需关心其他人可能正在侦听。

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

【讨论】:

我必须承认,我对 NSNotifications 了解不多,所以必须查一下。听起来好像它可能类似于我熟悉的其他语言中的概念,但是,“侦听器”被添加到列表中,并且每个侦听器都会收到某些事件的通知。我想这很适合我,所以谢谢你的提示。 (不要踩到马特的脚趾,但是......)是的,NSNotifications 类似于监听器(我们称它们为观察者)。 IMO,如果你本周只学习一种技术,那就是它 - 它们非常有用,尤其是在解耦类及其各自的任务中。 感谢您的提示。我马上去看看 NSNotifications!【参考方案3】:

单例并不是真正的问题,通过简单地实例化一个类并将其作为全局变量传递会导致同样的问题。 正如其他人提到的那样,队列是一种可能性,或者当您在 Singleton 中的服务上调用任务时,让它实例化一个 TaskRequest 对象,传入方法和回调委托,这样请求就不会互相践踏。事实上,无论如何,用队列来做这件事是个好主意。

【讨论】:

【参考方案4】:

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

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

单例用于与多个接收者进行通信,而委托模式通常用于一对一的通信。

【讨论】:

以上是关于带代表的单身人士:好主意还是坏主意?的主要内容,如果未能解决你的问题,请参考以下文章

具有“开放模式”的数据库 - 好主意还是坏主意?

以 UTC 存储时间总是一个好主意,还是以本地时间存储更好?

软删除是个好主意吗? [复制]

在 RMI 服务器中执行启动 rmiregistry 是个好主意吗?

Windows 上的 MySQL 命名管道——更快的最佳实践,还是坏主意?

Mono 和 C# IOCP:这是个好主意吗?