2012-07-25 56 views
1

在我們的項目早期,我們創建了一個Locale類,其中包含一個字符串,例如「en-US」,我們可以從中導出國家和語言以及其他信息。減少實例化對象數量的策略

我們現在面臨的問題是我們正在創建太多的Locale對象。這些對象幾乎在任何地方都被用作參數或Dictionary/HashSet鍵。在完成一些分析後,我們意識到我們花費太多時間來創建這些Locale對象。

由於知道我們有一組有限的區域設置,並且這些對象是不可變的,您建議將最小的對象數創建爲什麼樣的模式?

+1

只是作爲一個一邊給定答案(這是罰款),一定要考慮線程安全訪問(如果適用)。例如,使用'Dictionary'來緩存條目本質上不是線程安全的(除非可以保證在任何讀取之前緩存將被預先構建)。我不確定這對您是否有問題,但是考慮到您說「你到處都在使用它們」,甚至測量處理它們的不重要的處理時間,我認爲它可能適用。 – 2012-07-25 19:36:47

+0

好點!謝謝克里斯! – Martin 2012-07-25 19:59:26

回答

2

您可以使用Factory pattern通過某個索引創建對象並返回緩存的實例(假設您的對象是不可變的,否則返回共享副本會很危險)。

I.e.遵循CultureInfo.GetCultureInfo實現,它們的工廠方法通過其中一個鍵返回實例。

public static CultureInfo GetCultureInfo(string name) 

使用指定的區域性名稱檢索文化的緩存,只讀實例。

1

你想要做的是緩存。實現它有幾種方式,但總的想法是有一些結構來存儲所有以前創建的本地化,而不是創建一個新的,你首先搜索該集合。

您的一個選擇是創建一個Dictionary<string, Locale>。該字符串將是像「en-US」這樣的字符串。每次你想創建一個新的Locale首先檢查它是否在Dictionary。如果是,請將其退回。如果沒有,實際上做一個新的,並把它放在Dictionary

public static class LocaleFactory 
{ 
    private static Dictionary<string, Locale> cache = new Dictionary<string, Locale>(); 

    public static Locale GetLocal(string localeString) 
    { 
     Locale output; 
     if (cache.TryGetValue(localeString, out output)) 
     { 
      return output; 
     } 
     else 
     { 
      output = new Locale(localeString); 
      //do other creation stuff for the Locale 
      cache.Add(localeString, output); 
      return output; 
     } 
    } 
} 
0

你可以有這樣的事情:

class Locale { 
    static Locale en; 
    static Locale de; 
    ... 
    static Locale getLocale(string local){ 
     //checking if the wanted local already exists and return it or instance it 
    } 
}; 

像一個單身,但有一點不同