1

プロジェクトの早い段階で、国や言語、その他の情報を取得できる「en-US」などの文字列を含む Locale クラスを作成しました。

現在直面している問題は、あまりにも多くの Locale オブジェクトを作成していることです。これらのオブジェクトは、パラメーターまたは Dictionary/HashSet キーとしてほぼどこでも使用されます。プロファイリングを行った後、これらの Locale オブジェクトの作成に時間がかかりすぎていることに気付きました。

ロケールのセットが有限であり、それらのオブジェクトが不変であることを知っている場合、作成されるオブジェクトの数を最小限に抑えるためにどのパターンを提案しますか?

4

3 に答える 3

2

Factory パターンを使用して、いくつかのインデックスでオブジェクトを作成し、キャッシュされたインスタンスを返すことができます (オブジェクトが不変であると仮定すると、共有コピーを返すのは危険です)。

つまり、キーの 1 つによってインスタンスを返すファクトリ メソッドを持つCultureInfo.GetCultureInfo実装に従います。

public static CultureInfo GetCultureInfo(string name)

指定されたカルチャ名を使用して、カルチャのキャッシュされた読み取り専用インスタンスを取得します。

于 2012-07-25T18:10:15.897 に答える
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;
        }
    }
}
于 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 に答える