1

在我们项目的早期,我们创建了一个 Locale 类,其中包含一个字符串,例如“en-US”,我们可以从中派生国家和语言以及其他一些信息。

我们现在面临的问题是我们创建了太多的 Locale 对象。这些对象几乎在任何地方都用作参数或 Dictionary/HashSet 键。在进行了一些分析之后,我们意识到我们花费了太多时间来创建这些 Locale 对象。

知道我们有一组有限的语言环境并且这些对象是不可变的,您建议使用什么模式来保持创建的对象数量最少?

4

3 回答 3

2

您可以使用工厂模式通过某些索引创建对象并返回缓存的实例(假设您的对象是不可变的,否则返回共享副本会很危险)。

即遵循CultureInfo.GetCultureInfo实现,该实现具有通过键之一返回实例的工厂方法。

public static CultureInfo GetCultureInfo(string name)

使用指定的区域性名称检索缓存的只读区域性实例。

于 2012-07-25T18:10:15.897 回答
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;
        }
    }
}
于 2012-07-25T18:11:25.603 回答
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
    }
};

像单身但有点不同

于 2012-07-25T18:22:42.727 回答