`
zhanggenzhong
  • 浏览: 25596 次
  • 性别: 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引用,并调用这个对象的方法的话,可能会发现对象的初始化过程尚未完成,从而造成崩溃。

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

相关推荐

    设计模式之单例模式

    单例模式是软件设计模式中的一种基础模式,它在Java编程中被广泛应用。单例模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式可以有效地控制资源的使用,限制实例的数量,提高性能,尤其是在...

    Qt单例设计模式(1-8)

    在软件开发中,设计模式是一种在特定情境下解决常见问题的经验总结,被广泛应用于各种编程语言中。在Qt框架中,单例设计模式是一种经常被用到的设计模式,它确保一个类只有一个实例,并提供全局访问点。这个模式在...

    C#单列模式

    单例模式是软件设计模式中的一种经典模式,它在C#编程中被广泛使用,尤其在需要确保一个类只有一个实例并且提供全局访问点时。单例模式的主要目标是控制类的实例化过程,保证在整个应用程序运行期间,该类只创建一个...

    qt 单例模式,模板

    在编程领域,单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Qt框架中,我们同样可以应用单例模式来管理共享资源,如数据库连接。以下是对标题和描述中涉及知识点的详细解释...

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

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

    php基础设计模式大全(注册树模式、工厂模式、单列模式)

    工厂模式是一种创建型设计模式,用于创建对象而不必暴露创建逻辑到客户端,并且通过使用一个共同的接口来指向新创建的对象。它提供了一种将对象创建逻辑封装起来的方法,使用者在创建对象时不需要关心具体的实现细节...

    单例模式.txt

    单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁对象会带来较大性能开销的情况,或者对于那些需要共享单一资源的应用场景。 #### ...

    C++实现单例模式(懒汉式)源码

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在C++中,实现单例模式有多种方式,这里我们将聚焦于懒汉式(Lazy Initialization)的实现。懒汉式单例的特点...

    C# 窗体的单例模式

    在C#编程中,单例模式是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在窗体应用中尤为常见,因为它可以确保在整个应用程序中,只有一个窗体实例存在,避免了资源浪费和状态冲突...

    MVC移动开发demo

    在实际应用中,这种技术能够极大地提升用户体验,因为它允许开发者根据设备特性和用户界面需求来呈现最合适的内容。 **MVC架构** MVC是一种广泛用于软件工程的设计模式,特别适合于构建复杂且可维护的Web应用程序...

    android开发中常用的5中对话框

    在Android应用开发中,对话框(Dialog)是一种重要的交互元素,用于向用户显示临时信息或者进行简单的用户输入操作...在实际开发中,开发者可以根据具体需求灵活运用,甚至可以结合自定义布局进一步扩展对话框的功能。

    QT静态单例管理信号和槽

    QT静态单例管理信号和槽是Qt框架中一种常见的设计模式,用于确保应用程序中只有一个特定类的实例。在Qt编程中,单例模式通常用于管理全局资源,如数据库连接、配置文件读取或系统设置。这里我们将深入探讨如何在Qt中...

    Android高级应用源码-双列关联listview.zip

    总之,“Android高级应用源码-双列关联listview.zip”提供了一个实现双列关联ListView的实例,涉及到了Android开发中的自定义Adapter、事件监听、数据结构设计、性能优化等多个方面,对于想要深入学习Android UI开发...

    iphone开发实践

    在“iPhone开发实践”这一主题中,我们主要探讨的是如何针对iPhone平台进行应用开发,特别是基于Web的应用程序。iPhone开发基础教程通常涵盖了一系列的技术和工具,包括HTML、CSS、JavaScript,有时还会涉及PHP等...

    jQuery插件flexbox的应用程序

    在压缩包文件名称列表中,"jQuerySelect"可能是指一个与jQuery插件相关的选择器功能,用于选取页面上的特定元素以便应用Flexbox布局。这个文件可能是插件的核心部分,包含了用于选择和操作元素的函数,或者是一系列...

    安卓app开发项目-关于自适应屏幕方向和大小的一些经验(源码).zip

    在实际开发中,进行真机或模拟器测试是必不可少的步骤,以确保应用在各种设备上都能正常运行。同时,持续关注Android官方的最新设计指南和开发最佳实践,以便随时更新和优化应用的自适应策略。 通过以上方法,我们...

    win8小应用ListView、FilpView和GridView

    在Windows 8应用程序开发中,ListView、FlipView和GridView是三种非常重要的控件,用于展示数据集合。这些控件在用户界面设计中扮演着关键角色,提供了丰富的视觉效果和交互体验。下面将详细介绍这三个控件及其在...

    多个列Dlv等高层设计

    Dlv通常指的是“Delivery”或者在某些上下文中可能是“Display Layer”或“Design Layer”,在这里可能是为了简化表示“等高布局”或“等高列”的设计模式。这种设计方法常用于创建视觉上平衡且响应式的网页或应用...

    Laravel开发-wishlist .zip.zip

    下面我们将深入探讨Laravel的核心特性、心愿单系统的常见设计以及如何在实际开发中应用这些概念。 1. **Laravel框架简介** - **MVC架构**:Laravel遵循Model-View-Controller(MVC)设计模式,将业务逻辑、数据...

    PHP 面向对象程序设计(oop)学习笔记(三) – 单例模式和工厂模式

    单例模式和工厂模式是两种常见的设计模式,它们在实际开发中有着广泛的应用。 **单例模式**的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在某些场景下非常有用,比如管理共享资源、数据库连接或者...

Global site tag (gtag.js) - Google Analytics