减少实例化对象数量的策略

时间:2012-07-25 18:04:09

标签: c# .net optimization memory-management

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

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

知道我们有一组有限的语言环境并且这些对象是不可变的,你建议用什么模式将对象的数量保持在最小值?

3 个答案:

答案 0 :(得分:2)

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

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

public static CultureInfo GetCultureInfo(string name)
  

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

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分: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
    }
};

像单身但有点不同