2012-01-02 70 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容器允許您控制生命週期管理,因此您可以將您的記錄器視爲單例,而無需實際手動實施單例模式。

總結一下。如果一個單身人士適合你的情況(從你的描述看來似乎是合理的),那就去做吧。只要確保你權衡了利弊。你可能想嘗試一種不同的方法並比較兩者。