单例实例化

时间:2012-07-30 17:50:51

标签: java singleton

我写了下面的代码:

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

这就是为什么许多人都认为Singleton是一种反模式。您需要该对象的多个实例,每个实例对应一个实例。这不是一个单身人士。我喜欢说Singleton只是全局变量的委婉说法。您基本上允许以全局方式访问区域设置。

Singleton - The anti pattern

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

}

将所有类放在单独的包中。

这是实现目标的最简单方法。使用此方法的好处是,您可以轻松修改/添加与语言环境相关的更改,而无需修改其他代码。