Ste*_*lly 10 c++ singleton design-patterns
背景:我有一些实现主题/观察者设计模式的类,我已经使其成为线程安全的.如果在与通知相同的线程中构造,则A subject将observers通过简单的方法调用通知它.但是如果构造在不同的线程中,则通知将被发布到稍后由构造它的线程处理,然后在处理通知事件时可以进行简单方法调用.observer->Notified( this )observerobserverqueueobserver
所以......我有一个关联线程和队列的映射,在构造和销毁线程和队列时会更新.此映射本身使用互斥锁来保护对其的多线程访问.
地图是单身人士.
我过去曾经因使用单身人士而感到内疚,因为"这个应用程序中只有一个",并且相信我 - 我付出了忏悔!
我的一部分不禁想到应用程序中确实只有一个队列/线程映射.另一个声音说单身人士不好,你应该避免他们.
我喜欢删除单例并能够为我的单元测试存根的想法.麻烦的是,我很难想到一个好的替代解决方案.
过去工作的"通常"解决方案是传入指向要使用的对象的指针,而不是引用单例.我认为在这种情况下这将是棘手的,因为在我的应用程序中观察者和主题是10-a-penny并且将队列/线程映射对象传递到每个观察者的构造函数中是非常尴尬的.
我欣赏的是,我的应用程序中可能只有一张地图,但它不应该在主题和观察者类代码的内容中做出决定.
也许这是一个有效的单身人士,但我也很欣赏任何有关如何删除它的想法.
谢谢.
PS.我已经阅读了Singleton的替代方案,这篇文章在接受的答案中提到过.我不禁想到ApplicationFactory它只是另一个名字的另一个单身.我真的没有看到优势.
您的观察者可能很便宜,但它们依赖于通知队列线程映射,对吧?
\n\n明确这种依赖并控制它有什么尴尬的?
\n\n至于 Mi\xc5\xa1ko Hevery 在他的文章中描述的应用程序工厂,最大的优点是 1) 工厂方法不会隐藏依赖关系,2) 您依赖的单个实例不能全局可用,因此任何其他对象可以干预他们的状态。因此,使用这种方法,在任何给定的顶级应用程序上下文中,您都可以准确地知道什么在使用您的地图。通过全局可访问的单例,您使用的任何类都可能对地图做一些令人讨厌的事情。
\n