背景:我有一些类实现了我已经做出线程安全的主题/观察者设计模式。如果observer
与通知正在建立在同一线程中,则将通过简单的方法调用observer->Notified(this)
来通知它的observers
。但是如果observer
是在不同的线程中构建的,那么通知将被发布到queue
上,稍后由构建observer
的线程处理,然后可以在处理通知事件时进行简单的方法调用。帮我删除一个单例:寻找替代方案
所以...我有一个地图关联线程和队列,当线程和队列被构造和销毁时它会被更新。该映射本身使用互斥锁来保护对其的多线程访问。
该地图是一个单身人士。
我过去一直都在使用单身人士,因为“在这个应用程序中只会有一个人”,并相信我 - 我已经付出了我的忏悔!
我的一部分不禁想到应用程序中真的只有一个队列/线程映射。另一个声音说单身人士不好,你应该避免他们。
我喜欢删除单例并能够为单元测试存根的想法。麻烦的是,我很难想出一个好的替代解决方案。
过去一直使用的“常规”解决方案是将指针传递给要使用的对象,而不是引用单例。在这种情况下,我认为这样做会很棘手,因为观察者和主题在我的应用程序中是10分钱,并且必须将队列/线程映射对象传递给每个观察者的构造函数非常尴尬。
我很欣赏的是,我可能在我的应用程序中只有一张地图,但它不应该在作出该决定的主题和观察员类代码的内部。
也许这是一个有效的单身人士,但我也很感激任何想法,我可以如何删除它。
谢谢。
PS。我已阅读接受的答案中提到的What's Alternative to Singleton和this article。我不禁想到ApplicationFactory只是另一个名字而已。我真的没有看到优势。
为什么你想避免单身?他们当然有他们的位置。每一个习语都可能被滥用和滥用。但是thread-> notification_queue的应用程序范围的映射对我来说似乎是合理的。 – Mordachai 2009-11-12 21:46:15
@Mordachai:我知道单身人士有他们的位置,很可能这个队列/线索图是完全有效的。当我编写一些单元测试时,它只是开始出现问题,并且在那里有单例测试时感觉很尴尬。 – 2009-11-12 22:08:52
你正在使用什么线程库? – outis 2009-11-12 22:28:22