Registry of Singleton 方式(转)
发布时间:2010-06-06 17:10:43 文章来源:www.iduyao.cn 采编人员:星星草
Registry of Singleton 模式(转)
考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子类别中重新定义它,关于子类别实例的产生交由getInstance()来进行是最好的选择,例如:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// ....
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示系统环境变数
String style = getEnv("style");
if (style.equals("child1"))
instance = new ChildSingleton1();
else if (style.equals("child2r"))
instance = new ChildSingleton2();
else
instance = new Singleton();
}
return _instance;
}
// ....
}
上面这个程式片段改写自 Gof 书中关于Singleton的例子,并用Java实现;在书中指出,这个例子的缺点是每增加一个子类别,getInstance()就必须重新修改,这个问题在Java中可以使用Reflection机制来解决:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// ....
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示环境变数
String style = getEnv("style");
try {
instance = (Singleton)
Class.forName(style).newInstance();
}
catch(Exception e) {
System.out.println(
"Sorry! No such class defined!");
}
}
return instance;
}
// ....
}
上面的方式使用了Java的Reflection机制,并透过环境变数设定要产生的子类Singleton,如果不使用Reflection的话,Gof 书中提出的改进方法是使用Registry of Singleton方法:
import java.util.*;
public class Singleton {
// 注册表,用于注册子类别物件
private static Map registry = new HashMap();
private static Singleton instance;
public static void register(
String name, Singleton singleton) {
registry.put(name, singleton);
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示取得环境变数
String style = getEnv("style");
instance = lookup(style);
}
return instance;
}
protected static Singleton lookup(String name) {
return (Singleton) registry.get(name);
}
}
在Gof书中使用List来实现注册表,而在这边使用HasMap类别来实现,它是由Java SE所提供的;在父类别中提供一个register() 以注册Singleton的子类别所产生之实例,而注册的时机可以放在子类别的建构方法中加以实现,例如:
public class ChildSingleton1 extends Singleton {
public ChildSingleton1() {
// ....
// 注册子类别物件
register(getClass().getName(), this);
}
}
若要利用Singleton,则先使用这个子类别产生物件,这会向父类别注册物件,之后透过Singleton父类别来取得物件:
// 必须先启始这段注册程序
// 产生并注册ChildSingleton1物件
new ChildSingleton1();
// 产生并注册ChildSingleton2物件
new ChildSingleton2();
// 注册完成,可以使用父类别来取得子类的Singleton
// 至于取回何哪一个,视您的环境变数设置决定
Singleton childSingleton = Singleton.getInstance();
这种方式的缺点是您必须在程式中启始一段程序,先向父类别注册子类的Singleton,之后才能透过父类别来取得指定的子类别Singleton实例, 好处是可以适用于没有Reflection机制的语言,如果您想要改变Singleton父类传回的子类Singleton,可以在上面的 Singleton类别中加入一个reset()方法,将instance设定为null,然后重新设定环境变数,之后再利用 Singleton父类的getInstance()方法重新取得注册表中的其它子类。
事实上Registry of Singleton的真正优点正在于此,您可以使用父类别来统一管理多个继承的子类别之Singleton实例,您可以在需要的时候再向父类别注册子类 Singleton,必要时随时调整传回的子类别Singleton。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
谁能发个mapxtreme java开发地图的简单例子
我的邮箱是dpc13583522718@163.com,使用jsp页面输出,并能对地图进行放大、缩小、平移...
-
win7家庭版64位的,安装的ArcGis9.3和Arcgis10遇到问题!!各位大哥达人帮帮忙!!!
我的系统是win7家庭版64位的,先安装的ArcGis9.3,没成功!有...
-
mapinfo是否支持地图合并?
我现在已经购买了一个城市的地图(MAPINFO格式的),但是它是分为东、西两个城区(东西两区的图层名称和结构都...
-
向Postgis数据库增删改数据后,前台Openlayers刷新不出来?
向Postgis数据库增删改数据后,前台Openlayers刷新不出来?版本2.6。
[color=...
-
MapInfo如何实现Google Map中info window那样的功能?
各位大虾,刚开始学习MapInfo,用MapXtreme + C#开发。
可以载入地图(tab格式),然后...
-
怎样实现在地图上画出公交线路(包括各个站点),急
如题
暂时不求具体的实现,主要是关于思路的流程和实现的大致流程
我老是想不通mapin...
-
谁能发一个mapxtreme for java的例子!!!谢谢...
谁能发一个mapxtreme for java的例子!!!我的邮箱是:jeff_tang1114@sina.com,万分感谢.......
-
3维GIS的问题
各位看官,能否推荐下开源的3DGIS开发套件:用什么api,什么数据库,等?最好是c++的。
多谢指点。
------解决方案------...
-
Mapx开发中,经常会有GPS位置偏离道路的情况,这种情况下,客户希望把GPS点重新拉回到公路上,请问这样该怎么做?
在Mapx开发中,经常会因为...
-
mapx中如何通过线段来生成区域,求一算法
各位好!
现在有个这样的问题想请教下:
mapx中有判断点是不是在区域(手工绘制的多变形)中的方...