2010-11-03 151 views

回答

13

我在IBM網站上找到了此處。它很好地解釋了Logger Singleton類的用法。

真正的單身人士 的一個典型例子是日誌記錄服務。假設我們有一個基於事件的日誌記錄服務 :客戶端 對象請求文本被記錄日誌 發送消息到記錄 服務。通過監聽這些日誌記錄請求的日誌記錄 服務和處理它們的 ,其他對象實際上在某處(控制檯,文件, )記錄了 文本。首先,請注意 日誌服務通過經典 測試,作爲一個單身:

  • 請求者需要一個衆所周知的對象,該對象將請求發送到 日誌。這意味着訪問的全局點爲 。
  • 由於日誌記錄服務是多個 聽衆可以註冊的單個事件源,因此只有 需要是一個實例。

下面的鏈接:Use your singletons wisely

如果你不會使用一個單獨的類,你將不得不處理這些不同的記錄器之間的同步(寫入文件,或者任何你使用流)實例。所以當你只有一個全局Logger實例時,它更容易。

0

取決於日誌框架。通常你想要所有的消息都去一個日誌,所以你想要所有的代碼使用相同的記錄器。但是記錄器類並不一定是一個單獨的東西來確保這一點。

2

主要問題是實際日誌持續存在的位置。

如果您正在一個文件系統上編寫,有多個實例(因此可能會有多個線程)可能會導致出現亂碼文件。

從某種意義上說,根據緩衝和其他低級機制,來自一個寫入的消息可能最終與來自其他消息的消息(或消息的一部分)混合在一起。

這可能是一個小問題,但它是我能想到的關於只有一個(因此是串行)日誌寫入對象的唯一的問題。

2

如果您有多個具有不同內容的日誌流,則可以使用針對不同輸出初始化的多個記錄器類實例。

但是,如果您只有一個日誌流,則具有多個日誌記錄類實例會導致更復雜的實現,因爲實例必須一起工作來管理實際資源。例如考慮一個記錄器,每個消息記錄一個序列號。兩個實例將不得不同步他們的序列計數器,這要求他們相互討論,協商計數器增加等等。(在靜態類成員中共享計數器的替代方案相當於具有單例記錄器)

相關問題