2012-01-02 107 views
8

我正在运行一个服务器,有时必须搜索客户端查询的内容。我想将客户端查询写入磁盘以获取记录,但我不想再拖慢搜索速度。 (搜索已经是瓶颈......)正确使用单身设计模式

因此,当客户端执行搜索时,我让客户端的线程向单线程发送消息,该线程将处理磁盘写入,而客户端线程继续处理客户的请求。这样,磁盘上的文件不会出现同步问题,并且不会降低客户端的体验。

我在这里有一个概念性问题:在这种情况下是单身人士吗?在我最近的编程中,我一直在使用单例设计模式,并且我想确保我将它用于其预期的用途。

任何反馈,非常感谢。

+3

如果没有看到您的整体架构,很难回答这个问题。单身模式存在缺陷(导致单元测试困难等),由您决定是否相关... – 2012-01-02 23:08:34

+1

感谢Oli的快速反应;我已阅读过有关单元测试的困难,但并不了解整体影响。为什么要避免这种重要性的全球状态?例如,如果一个程序写入的磁盘上只有一个文件,是不是想确保它不能同时被不同的部分访问? – Sal 2012-01-02 23:14:18

+0

全局状态的存在可能使注入依赖变得困难(这是[模拟测试](http://en.wikipedia.org/wiki/Mock_object)的基础)。请观看此讲座了解更多详情:http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html。 – 2012-01-02 23:15:32

回答

7

singleton pattern肯定被过度使用,它的份额​​difficulties(单元测试就是规范的例子),但是像设计中的所有东西一样,你需要权衡你的特定场景的利弊。单例模式确实有其用处。有些选项可能会让你获得单例行为,同时缓解一些固有的问题:

Interception(通常被称为面向方面的编程,尽管我已经看到辩论他们不完全相同的东西。 ..在这个时候我找不到这篇文章)肯定是一个选择。您可以使用任何施工注塑组合,decorator模式,抽象工厂和inversion of control container。我没有注意到我的Java IoC容器,但有一些.Net容器允许自动拦截(我相信Spring.Net的确如此,Spring(Java)很可能已经内置了这个容器)。这对于任何类型的交叉问题都非常方便,您需要跨多个层执行某些类型的操作(安全性,日志记录等)。此外,大多数IoC容器允许您控制生命周期管理,因此您可以将您的记录器视为单例,而无需实际手动实施单例模式。

总结一下。如果一个单身人士适合你的情况(从你的描述看来似乎是合理的),那就去做吧。只要确保你权衡了利弊。你可能想尝试一种不同的方法并比较两者。