在我們的項目早期,我們創建了一個Locale類,其中包含一個字符串,例如「en-US」,我們可以從中導出國家和語言以及其他信息。減少實例化對象數量的策略
我們現在面臨的問題是我們正在創建太多的Locale對象。這些對象幾乎在任何地方都被用作參數或Dictionary/HashSet鍵。在完成一些分析後,我們意識到我們花費太多時間來創建這些Locale對象。
由於知道我們有一組有限的區域設置,並且這些對象是不可變的,您建議將最小的對象數創建爲什麼樣的模式?
在我們的項目早期,我們創建了一個Locale類,其中包含一個字符串,例如「en-US」,我們可以從中導出國家和語言以及其他信息。減少實例化對象數量的策略
我們現在面臨的問題是我們正在創建太多的Locale對象。這些對象幾乎在任何地方都被用作參數或Dictionary/HashSet鍵。在完成一些分析後,我們意識到我們花費太多時間來創建這些Locale對象。
由於知道我們有一組有限的區域設置,並且這些對象是不可變的,您建議將最小的對象數創建爲什麼樣的模式?
您可以使用Factory pattern通過某個索引創建對象並返回緩存的實例(假設您的對象是不可變的,否則返回共享副本會很危險)。
I.e.遵循CultureInfo.GetCultureInfo實現,它們的工廠方法通過其中一個鍵返回實例。
public static CultureInfo GetCultureInfo(string name)
使用指定的區域性名稱檢索文化的緩存,只讀實例。
你想要做的是緩存。實現它有幾種方式,但總的想法是有一些結構來存儲所有以前創建的本地化,而不是創建一個新的,你首先搜索該集合。
您的一個選擇是創建一個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;
}
}
}
你可以有這樣的事情:
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
}
};
像一個單身,但有一點不同
只是作爲一個一邊給定答案(這是罰款),一定要考慮線程安全訪問(如果適用)。例如,使用'Dictionary'來緩存條目本質上不是線程安全的(除非可以保證在任何讀取之前緩存將被預先構建)。我不確定這對您是否有問題,但是考慮到您說「你到處都在使用它們」,甚至測量處理它們的不重要的處理時間,我認爲它可能適用。 – 2012-07-25 19:36:47
好點!謝謝克里斯! – Martin 2012-07-25 19:59:26