我写了下面的代码:
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
}
}
我的问题是:我可以重复使用相同的单例对象两次吗?它是实例化单例对象的有效方法吗?
答案 0 :(得分:1)
是的,您可以重复使用相同的单例对象。
但是:如果你这样做,你不必在对象中包含任何特殊处理来确定它用于哪种语言,它应该始终以相同的方式运行。
如果必须使其行为不同,请考虑创建一个SiteMap_en_US(可能是SiteMap_es_US)的子类,该子类派生自SiteMap_en_US,并且会覆盖少量行为。
可以在对象中进行各种区域设置检查以确定其行为,但我强烈建议您考虑使用更容易维护的不同方法。
答案 1 :(得分:0)
这就是为什么许多人都认为Singleton是一种反模式。您需要该对象的多个实例,每个实例对应一个实例。这不是一个单身人士。我喜欢说Singleton只是全局变量的委婉说法。您基本上允许以全局方式访问区域设置。
答案 2 :(得分:0)
您可以创建基础class SiteMapUS
并对其进行扩展,以创建两个子类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
}
}
将所有类放在单独的包中。
这是实现目标的最简单方法。使用此方法的好处是,您可以轻松修改/添加与语言环境相关的更改,而无需修改其他代码。