背景:我有一些類實現了我已經做出線程安全的主題/觀察者設計模式。如果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