1

私は以下に示すコードを書きました:

public class SiteMapFactory {

    public static ISiteMap getSiteMap(Locale loc) {
        ISiteMap returnMap = null;

        if (loc.equals(Locale.US)) {
            returnMap = SiteMap_en_US.getInstance();
        }
        if(loc.equals(new Locale("es","US"))){
            returnMap = SiteMap_en_US.getInstance();
        }
        if(loc.equals(Locale.CANADA)){
            returnMap = SiteMap_fr_CA.getInstance();
        }
        return returnMap;
    }
}

ウェブサイトのen_US(英語)とes_US(スペイン語)の両方で同じサイトマップを返したいです。そのため、スペイン語版と英語版の両方の米国サイトマップをインスタンス化しています(サードパーティベンダーが英語ページをスペイン語に変換しています)。サイトマップをインスタンス化する方法は、シングルトンを使用しています。シングルトンオブジェクトは次のように作成されます。

public class SiteMap_en_US extends SiteMapTree {
    private static SiteMap_en_US m_instance;

    private SiteMap_en_US() {}

    static {
        m_instance = new SiteMap_en_US();
        m_instance.init();
    }

    public static SiteMap_en_US getInstance(){
        return m_instance;
    }

    @Override
    protected void init() {
        //some code
    }
}

私の質問は、同じシングルトンオブジェクトを2回再利用できますか?シングルトンオブジェクトをインスタンス化する有効な方法ですか?

4

3 に答える 3

1

はい、同じシングルトン オブジェクトを再利用できます。

ただし、これを行う場合、オブジェクトが使用されている言語を特定するためにオブジェクト内に特別な処理を含める必要はありません。オブジェクトは常に同じように動作する必要があります。

別の動作をさせる必要がある場合は、SiteMap_en_US から派生し、少数の動作がオーバーライドされた SiteMap_en_US (おそらく SiteMap_es_US) のサブクラスを作成することを検討してください。

オブジェクト内であらゆる種類のロケール チェックを実行してその動作を判断することは可能ですが、維持しやすい別のアプローチを検討することを強くお勧めします。

于 2012-07-30T17:57:44.017 に答える
0

ベースclass SiteMapUSを作成し、それを拡張して、2 つのサブクラスSiteMapUSEnglishとを作成できますSiteMapUSSpanish

public class SiteMapUS{
    protected SiteMapUS(){

    }
}

public class SiteMapUSEnglish{

    protected SiteMapUSEnglish(){

    }

    public SiteMapUSEnglish getInstance(){
        //return instance
    }

}


public class SiteMapUSSpanish{

    protected SiteMapUSSpanish(){

    }

    public SiteMapUSSpanish getInstance(){
        //return instance
    }

}

すべてのクラスを個別のパッケージに配置します。

これは、目標を達成するための最も簡単な方法です。このアプローチを使用する利点は、他のコードを変更することなく、ロケール関連の変更を簡単に変更/追加できることです。

于 2012-07-30T18:05:16.360 に答える
0

これが、Singleton がアンチパターンであることに多くの人が同意する理由です。ロケールごとに 1 つずつ、オブジェクトの複数のインスタンスが必要です。シングルトンではありません。シングルトンはグローバル変数の単なる婉曲表現だと言いたいです。基本的に、ロケールにアクセスするためのグローバルな方法を許可しています。

シングルトン - アンチパターン

于 2012-07-30T17:54:06.660 に答える