2010-03-23 121 views
5

想象一下,我有一個用於顯示文本的多個Viewer組件,並且它們有幾個用戶可以切換的模式(用於查看文本/二進制/十六進制的不同字體預設)。 什麼是管理共享對象的最佳方法 - 例如字體,查找對話框等?我認爲帶有懶惰初始化對象的靜態類是可以的,但這可能是錯誤的想法。在類之間管理共享資源?

static class ViewerStatic 
{ 
    private static Font monospaceFont; 
    public static Font MonospaceFont 
    { 
     get 
     { 
      if (monospaceFont == null) 
       //TODO read font settings from configuration 
       monospaceFont = new Font(FontFamily.GenericMonospace, 9, FontStyle.Bold); 
      return monospaceFont; 
     } 
    } 

    private static Font sansFont; 
    public static Font SansFont 
    { 
     get 
     { 
      if (sansFont == null) 
       //TODO read font settings from configuration 
       sansFont = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold); 
      return sansFont; 
     } 
    } 
} 
+2

請注意,您放入的任何IDisposable資源(字體,對話框等)你的靜態類將被分配給你的應用程序的生命。這可能是你想要的;只是供參考。 – TrueWill 2010-03-23 17:08:09

+0

這就是我想要的,因爲我希望資源能夠在創建後永久生存,因此可以在第一次延遲加載之後「立即」提升它們。 – Axarydax 2010-03-23 17:16:12

+0

如果我在同行評議中閱讀這段代碼,我不會眨眼睛(看起來不錯!)。 – 2010-03-23 19:41:25

回答

1

對於您希望創建一次然後重新使用的項目,有兩種相關模式:Singleton和Cache。如果您將永久重複使用該項目,單身人士就可以。分配給該實例的內存永遠不會被清除。如果你將會重複使用該項目一段時間,但也許這個功能將不會被使用幾天,我建議使用緩存。然後可以在物品不再使用時清除內存。

如果您使用的是Singleton,那麼您可能需要直接初始化字體,而不是使用Lazy init模式。對我而言,字體聽起來很簡單,不會出錯。但是,如果項目在構建過程中可能失敗(可能是由於缺少字體文件或其他東西),那麼懶惰模式至少會允許它在下次重試。之後即使失敗,也無法重新生成靜態初始化程序,而無需重新啓動整個應用程序。小心限制這些重試!

最後,類「ViewerStatic」的名稱引發了一個問題。有一種反模式被稱爲「上帝」對象。我稱之爲「桶」。如果你創造它,東西就會來。你很快就會發現各種各樣的東西被傾倒在水桶裏。您的ViewerStatic類將變得巨大。最好有一個名爲「FontFlyWeights」的類,然後是另一個名爲「ConstantStrings」或「SystemDialogFactory」的類......等等。

1

這對我來說似乎很好,但它真的有必要嗎?簡單的方法是在需要時創建新的字體和對話框,然後在必要時處理它們,並讓垃圾收集器清理它們。

您是否測量過該簡單方法是否有顯着的成本,使得值得添加緩存共享對象的複雜性?