`
zhanggenzhong
  • 浏览: 25065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

单列设计模式在实际开发中的一个应用

    博客分类:
  • Java
阅读更多

     在开发中经常用到select的标签将数据加载,供用户选择,我最近在开发一个跟帐务有关的应用系统,系统中包括了很多查

询功能,比如那款游戏进行查询,每次到查询页面,必须要显示所有游戏,为了避免每次打开该页面都要查询数据库的话那执

行效率就会很低。所以我写了一个缓存,简单解决这个问题。供大家查考!

java 代码
  1. public class SystemInfoCache {   
  2.   
  3.     private static Map map = null;   
  4.   
  5.     private static SystemInfoCache instance;   
  6.   
  7.     private static Object mutex = new Object();   
  8.   
  9.     /**  
  10.      * 单列设计模式保证应用中只有一个对象  
  11.      * @return  
  12.      */  
  13.     public static SystemInfoCache getInstance() {   
  14.   
  15.         if (instance == null) {   
  16.   
  17.             synchronized (mutex) {   
  18.   
  19.                 if (instance == null) {   
  20.   
  21.                     loadMap();   
  22.                     instance = new SystemInfoCache(map);   
  23.   
  24.                 }   
  25.   
  26.             }   
  27.   
  28.         }   
  29.         return instance;   
  30.   
  31.     }   
  32.   
  33.     /**  
  34.      * 通过id获取应用名称  
  35.      *   
  36.      * @param id 应用id对应数据中的主键  
  37.      * @return  
  38.      */  
  39.     public String getSysinfoName(Integer id) {   
  40.   
  41.         SystemInfoDTO dto = null;   
  42.         if (getInstance().map.containsKey(id)) {   
  43.   
  44.             dto = getInstance().map.get(id);   
  45.             return dto.getSysName();   
  46.         }   
  47.         try {   
  48.   
  49.             dto = BizLocator.getSystemInfoBiz().getSystemInfoById(id);   
  50.             return dto.getSysName();   
  51.   
  52.         } catch (DAOException e) {   
  53.   
  54.             e.printStackTrace();   
  55.   
  56.         }   
  57.         return "";   
  58.   
  59.     }   
  60.   
  61.     /**  
  62.      * 获得列表  
  63.      * @return 获得系统信息列表  
  64.      */  
  65.     public List<systeminfodto></systeminfodto> getList() {   
  66.   
  67.         if (instance.map == null)   
  68.             this.loadMap();   
  69.   
  70.         List<systeminfodto></systeminfodto> list = new ArrayList<systeminfodto></systeminfodto>();   
  71.         int size = instance.map.size();   
  72.         Iterator iter = instance.map.entrySet().iterator();   
  73.         for (int i = 0; i < size; i++) {   
  74.   
  75.             Map.Entry entry = (Map.Entry) iter   
  76.                     .next();   
  77.             list.add(entry.getValue());   
  78.         }   
  79.         return list;   
  80.   
  81.     }   
  82.   
  83.     /**  
  84.      * 加载数据中的数据  
  85.      *  
  86.      */  
  87.     private static void loadMap() {   
  88.   
  89.         map = new HashMap();   
  90.         try {   
  91.   
  92.             List<systeminfodto></systeminfodto> list = BizLocator.getSystemInfoBiz()//通过此方法获取数据中的应用系统信息   
  93.                     .getSystemInfoByName("");   
  94.             for (SystemInfoDTO dto : list) { //存储到map中   
  95.                 map.put(dto.getSysId(), dto);   
  96.             }   
  97.   
  98.         } catch (DAOException e) {   
  99.   
  100.             e.printStackTrace();   
  101.   
  102.         }   
  103.   
  104.     }   
  105.   
  106.     private SystemInfoCache(Map map) {   
  107.     }   
  108. }   

注:记录本人在开发中遇到的问题,与大家一起交流,如果有的好的解决方法,请指导一下,谢谢!

 

分享到:
评论
8 楼 gordonAtJava 2007-09-25  
singleton一般有2种,
一种是类加载的时候就把所有的事情做了,然后getinstance的时候就只是return,这样的叫做饿汉型。
另外一种是在getinstance的时候才去判断是否初始化过,如果还没初始化过就初始化,然后return,这样的叫做懒汉型
7 楼 gordonAtJava 2007-09-25  
初始化和new 的动作这里已经做了
    static {   
        loadMap();   
        instance = new SystemInfoCache(map);   
    }  

那个getInstance只是个return而已
6 楼 realorg 2007-09-25  
Pan Feng 的 单例工厂方法

   
public static SystemInfoCache getInstance() {   
        return instance;   
    }

不用加 synchronized 同步?
5 楼 ttitfly 2007-09-23  
同意楼上的观点 :)
4 楼 JavaPanFeng 2007-09-18  
double check在JDK 5以上可以实现了(据说是修改了JVM),但仍然不推荐 使用。

其实用下面的代码更好,还省去了synchronize的开销,同样也是线程安全的。
private static Map map = null;

	private static SystemInfoCache instance;
	
	static {
		loadMap();
		instance = new SystemInfoCache(map);
	}

	private SystemInfoCache(Map map) {
	}

	public static SystemInfoCache getInstance() {
		return instance;
	}
3 楼 dennis_zane 2007-08-28  
不仅仅是double check的有问题,在迭代过程以及调用contains、size之类需要迭代的方法时也应当加锁
2 楼 hax 2007-08-28  
请看http://www-128.ibm.com/developerworks/java/library/j-dcl.html

楼上的,那个意思是,instance已经指向了一个新的SystemInfoCache的实例,但是构造函数尚未执行,如果另一个线程这个时候进入就会面对一个还没有初始化完成的对象从而失败。
1 楼 eivenchan 2007-08-28  
请教一下:

你上面实现单例模式时使用了双重检查成例,不过我在<<Java与模式>>一书当中看到过:双重检查成例一般不适用于Java语言.

这是书中原话:
双重检查成例的"懒汉式"单例类不能工作的基本原因在于,在Java编译器中SystemInfoCache类的初始化与instance变量的赋值顺序不可预料。如果一个线程在没有同步化的条件下读取instance引用,并调用这个对象的方法的话,可能会发现对象的初始化过程尚未完成,从而造成崩溃。

这段话的意思我不时很明白,能给我解释一下吗?
谢谢

相关推荐

    c#设计模式之单例模式的实现方式

    单例模式无论是在实际开发中还是在软件应用中比较常见,比如,windows系统的任务管理器、IIS的HttpApplication、实际项目中的日志组件等等 实现方式 单例模式为了实现一个实例,那么只有不把实例创建暴露出去,只...

    C#程序开发范例宝典(第2版).part08

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    PHP程序开发范例宝典III

    个实例,每个实例都突出实用性,绝大部分实例都体现了PHP编程人员在实际项目开发过程中总结出的经验技巧。  《PHP程序开发范例宝典》内容充实,实例丰富,特别适于PHP编程人员和广大计算机爱好者学习开发使用,也...

    C#程序开发范例宝典(第2版).part12

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    C#程序开发范例宝典(第2版).part13

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    C#程序开发范例宝典(第2版).part02

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

Global site tag (gtag.js) - Google Analytics