在我们项目的早期,我们创建了一个 Locale 类,其中包含一个字符串,例如“en-US”,我们可以从中派生国家和语言以及其他一些信息。
我们现在面临的问题是我们创建了太多的 Locale 对象。这些对象几乎在任何地方都用作参数或 Dictionary/HashSet 键。在进行了一些分析之后,我们意识到我们花费了太多时间来创建这些 Locale 对象。
知道我们有一组有限的语言环境并且这些对象是不可变的,您建议使用什么模式来保持创建的对象数量最少?
在我们项目的早期,我们创建了一个 Locale 类,其中包含一个字符串,例如“en-US”,我们可以从中派生国家和语言以及其他一些信息。
我们现在面临的问题是我们创建了太多的 Locale 对象。这些对象几乎在任何地方都用作参数或 Dictionary/HashSet 键。在进行了一些分析之后,我们意识到我们花费了太多时间来创建这些 Locale 对象。
知道我们有一组有限的语言环境并且这些对象是不可变的,您建议使用什么模式来保持创建的对象数量最少?
您可以使用工厂模式通过某些索引创建对象并返回缓存的实例(假设您的对象是不可变的,否则返回共享副本会很危险)。
即遵循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
}
};
像单身但有点不同