背景:我有一些实现了主题/观察者设计模式并使其线程安全的类。如果以相同线程构造了一个 `subject`,则会通过简单的方法调用 `observer->Notified(this)` 来通知其 `observers`。但是,如果在另一个线程中构造了 `observer`,则通知将被发布到 `queue` 中,稍后由构造 `observer` 的线程处理,然后在处理通知事件时可以进行简单的方法调用。
因此...我有一个映射将线程和队列相关联,在构建和销毁线程和队列时会更新该映射。这个映射本身使用互斥锁来保护多线程访问。
这个映射是单例的。
过去我曾经犯过使用单例的错误,因为"这个应用程序中只会有一个",相信我,我已经为这个付出代价!
我的一部分认为在应用程序中真的只有一个队列/线程映射。另一方面,单例不好,应该避免使用。
我喜欢消除单例的想法,并能够为我的单元测试进行桩测试。问题是,我很难想到一个好的替代解决方案。
“通常”的解决方案是传递指向对象的指针而不是引用单例对象。我认为在这种情况下会很棘手,因为在我的应用程序中,观察者和主题随处可见,必须将队列/线程映射对象传递到每个单独观察者的构造函数中。
我欣赏的是,可能在我的应用程序中只有一个映射,但不应该在主题和观察者类代码的深处做出这个决定。
也许这是一个有效的单例模式,但我也希望得到任何关于如何消除它的想法。
谢谢。
因此...我有一个映射将线程和队列相关联,在构建和销毁线程和队列时会更新该映射。这个映射本身使用互斥锁来保护多线程访问。
这个映射是单例的。
过去我曾经犯过使用单例的错误,因为"这个应用程序中只会有一个",相信我,我已经为这个付出代价!
我的一部分认为在应用程序中真的只有一个队列/线程映射。另一方面,单例不好,应该避免使用。
我喜欢消除单例的想法,并能够为我的单元测试进行桩测试。问题是,我很难想到一个好的替代解决方案。
“通常”的解决方案是传递指向对象的指针而不是引用单例对象。我认为在这种情况下会很棘手,因为在我的应用程序中,观察者和主题随处可见,必须将队列/线程映射对象传递到每个单独观察者的构造函数中。
我欣赏的是,可能在我的应用程序中只有一个映射,但不应该在主题和观察者类代码的深处做出这个决定。
也许这是一个有效的单例模式,但我也希望得到任何关于如何消除它的想法。
谢谢。
PS. 我已经阅读了替代Singleton的方法和这篇文章被接受答案提到的内容。我不禁想,应用工厂只是另一种单例模式而已,我并没有看到任何优势。
-threadDictionary
一样? - outis