`
mamaoyuan625
  • 浏览: 173290 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java单例模式的一个小结

阅读更多

单例模式单例模式是一种常见的设计模式,
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

一、懒汉式单例在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
单例模式-懒汉式单例
public class LazySingleton {    
   /*** 私有静态对象,加载时候不做初始化      */    
   private static LazySingleton m_intance=null;     
    /*** 私有构造方法,避免外部创建实例      */    
    private LazySingleton(){}    
    /*** 静态工厂方法,返回此类的唯一实例.* 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */    
    synchronized public static LazySingleton getInstance(){
        if(m_intance==null){
           m_intance=new LazySingleton();
         }
         return m_intance;
    }
}

//测试一下单例模式
  LazySingleton lazySingleton = LazySingleton.getInstance();  
  LazySingleton lazySingleton1 = LazySingleton.getInstance();
  
  if(lazySingleton==lazySingleton1)){
   System.out.println("同一个对象实例");
  }else{
   System.out.println("不是同一个对象实例");
  }

二、饿汉式单例在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
/***单例模式-饿汉式单例*/
public class EagerSingleton {    
    /**私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象*/
    private static final EagerSingleton m_instance = new EagerSingleton();
    /*** 私有构造方法,避免外部创建实例      */    
    private EagerSingleton() {}     //提供了一个空的构造方法
    /*** 静态工厂方法,返回此类的唯一实例.* @return EagerSingleton      */    
    public static EagerSingleton getInstance() {
       return m_instance;    
    }
}

//下面来判断一下有没有达到单例效果(系统运行的时候只出来一个空例) 
EagerSingleton eagerSingleton = EagerSingleton.getInstance();  
EagerSingleton eagerSingleton1 = EagerSingleton.getInstance();
  
  if(eagerSingleton==eagerSingleton1)){
   System.out.println("同一个对象实例");
  }else{
   System.out.println("不是同一个对象实例");
  }

三、登记式单例这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
/*** 单例模式- 登记式单例*/
public class RegSingleton {    
    /*** 登记薄,用来存放所有登记的实例      */    
    private static Map<String, RegSingleton> m_registry = new HashMap();    
    //在类加载的时候添加一个实例到登记薄    
        static {
           RegSingleton x = new RegSingleton();
           m_registry.put(x.getClass().getName(), x);
        }    
        /*** 受保护的默认构造方法*/    
        protected RegSingleton() {}    
        /*** 静态工厂方法,返回指定登记对象的唯一实例;
             * 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
             * @param name
             * @return
                RegSingleton      */    
public static RegSingleton getInstance(String name) {        
      if (name == null) {            
            name = "RegSingleton";         
       }        
       if (m_registry.get(name) == null) {
            try {
                 m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
            } catch (InstantiationException e) {                
                  e.printStackTrace();            
            } catch (IllegalAccessException e) {                
                   e.printStackTrace();            
           } catch (ClassNotFoundException e) {                
                   e.printStackTrace();           
            }        
        }        
        return m_registry.get(name);    
}    


/** * 一个示意性的商业方法      * @return String      */    
public String about() {        
      return "Hello,I am RegSingleton!";    
}}

四、单例模式的一个应用该应用是配置文件管理类。为了本例能正确运行,我在C盘下先建立了一个xxxx.properties文件,内容如下:-------------------

user=rootpassword=leizhimin这个配置文件管理类的代码如下:
单例模式应用-单例类应用-配置文件管理*/
public class ConfigManager {    
/*** 属性文件全名*/    
private static final String PFILE = "C:\\xxx.properties";   

转自:http://www.web36.cn/java/basic/2009/0610/98.html

分享到:
评论
2 楼 vinkeychen 2010-11-09  
uqortbsa 写道
你正好相反过来,懒汉和饿汉

博主也没完全弄反吧?基本上是那样,就懒汉式的第一段话说成饿汉式的啦吧。
1 楼 uqortbsa 2010-09-25  
你正好相反过来,懒汉和饿汉

相关推荐

    java设计模式

    7.2 单例模式的定义 7.3 单例模式的应用 7.4 单例模式的扩展 7.5 最佳实践 第8章 工厂方法模式 8.1 女娲造人的故事 8.2 工厂方法模式的定义 8.3 工厂方法模式的应用 8.3.1 工厂方法模式的优点 8.3.2 工厂方法模式的...

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java基础知识点总结.docx

    Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java...

    java范例开发大全源代码

     实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248 ...

    java范例开发大全

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

    Java范例开发大全 (源程序)

     实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248  8.4 ...

    Java范例开发大全(全书源程序)

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 ...

    java范例开发大全(pdf&源码)

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    1.3开发第一个Java程序 1.3.1如何编写源代码 1.3.2如何将源代码编译成.class文件 1.3.3如何执行.class文件 1.3.4新手常见错误 1.4用Eclipse开发Java程序 1.4.1Eclipse的概念 1.4.2安装Eclipse 1.4.3如何建立...

    Android中单例模式的一些坑小结

    主要给大家介绍了关于Android中单例模式的一些坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    [多媒体/3D 动画/游戏] Unity3D游戏编程基础入门班 by 泰课在线(价值200元)[高清完整版][AVI+TS][1.43GB]

    课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity中的五种视图 课时7 Unity中的...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Activity Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,是一个负责与用户交互的组件 SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。...

Global site tag (gtag.js) - Google Analytics