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(西班牙语)返回相同的站点地图。所以我正在为西班牙语和英语版本实例化美国站点地图(第三方供应商正在将我们的英语页面转换为西班牙语)。站点地图的实例化方式是使用singleton。单例对象创建如下:

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
    }
}

我的问题是:我可以重复使用同一个单例对象两次吗?这是实例化单例对象的有效方法吗?

4

3 回答 3

1

是的,您可以重用相同的单例对象。

但是:如果这样做,则不必在对象中包含任何特殊处理来确定它用于哪种语言,它应该始终以相同的方式运行。

如果您必须使其行为不同,请考虑创建 SiteMap_en_US 的子类(可能是 SiteMap_es_US),该子类派生自 SiteMap_en_US 并有少量行为被覆盖。

可以在对象中进行各种区域设置检查以确定其行为,但我强烈建议考虑一种更易于维护的不同方法。

于 2012-07-30T17:57:44.017 回答
0

这就是为什么许多人同意 Singleton 是一种反模式的原因。您需要对象的多个实例,每个语言环境一个。这不是单例。我喜欢说 Singleton 只是全局变量的委婉说法。您基本上允许以全局方式访问语言环境。

Singleton - 反模式

于 2012-07-30T17:54:06.660 回答
0

您可以创建基础class SiteMapUS并扩展它以创建两个子类SiteMapUSEnglishSiteMapUSSpanish.

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 回答