A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© danmo 中级黑马   /  2014-8-5 13:31  /  1850 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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



懒汉式单例:
需要加锁才能实现多线程同步,但是效率会降低。优点是延时加载。
public class LazySingleton {
//私有静态变量,加载时不初始化
    private static LazySingleton lazySingleton = null;
   
    //私有的构造方法,避免外部创建实例
    private LazySingleton(){
     
    }
  
   
    synchronized public static LazySingleton getInstance(){
      if(lazySingleton == null){
       lazySingleton = new LazySingleton();
      }
      return lazySingleton;      
    }
}





  饿汉式单例:
  因为加载类的时候就创建实例,所以线程安全(多个ClassLoader存在时例外)。
  缺点是不能延时加载

public class EagerSingleton {
//私有静态唯一的变量,在类加载好了,就创建了实例
     private static final EagerSingleton eagerSingleton = new EagerSingleton();
   
     //私有的构造方法,避免外界创建实例
     private EagerSingleton(){
     
     }
   
   
    public static EagerSingleton getInstance(){
           return eagerSingleton;
     }
}



  登记式单例:
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。
只是它的子类实例化的方式只能是懒汉式的, 这是无法改变的。
登记式单例类的一个缺点:(1)由于子类必须允许父类以构造子调用产生实例,因此,
它的构造方法必须是公开的这样一来,就等于允许了以这样方式产生实例
而不在父类的登 记中。(2)由于父类的实例必须存在才可能有子类的实例,
这在有些情况下是一个浪费。这是登记式单例类的另一个缺点。

import java.util.*;
public class RegSingleton {
//登记薄,用来存放所有的实例
    private static Map regSingletonMap = new HashMap();
   
    //在类加载的时候添加一个实例到登记薄
    static{
     RegSingleton regSingleton = new RegSingleton();
     regSingletonMap.put(regSingleton.getClass().getName(),regSingleton);
    }

    //保护的默认构造子
    protected RegSingleton(){
     
    }  
   
   
    public static RegSingleton getInstance(String name){
       if(name == null){
       name = "RegSingleton";
       }
       if(regSingletonMap.get(name) == null){
       try{
        regSingletonMap.put(name, (RegSingleton)Class.forName(name).newInstance());
       }catch(Exception e){
        e.printStackTrace();
       }
       }
       return regSingletonMap.get(name);
    }
}

13 个回复

倒序浏览
总结的不错,受教了
回复 使用道具 举报
感谢分享,
回复 使用道具 举报
  登记式单例: 学习一下
回复 使用道具 举报
qingxi1 来自手机 中级黑马 2014-8-6 07:15:39
报纸
感谢楼主分享,又学到不少东西
回复 使用道具 举报
学习了,谢谢
回复 使用道具 举报
学习一下
回复 使用道具 举报
登记时单例以前没听过  呵呵学习了  知道有就好,应该不用掌握吧?用的多吗
回复 使用道具 举报
学习了,还有一种是登记式
回复 使用道具 举报
登记式在什么情况下用啊,登记是什么意思
回复 使用道具 举报
很不错,学习了
回复 使用道具 举报
总结的很好!!学习了!!谢谢
回复 使用道具 举报
感谢分享
回复 使用道具 举报
登记式主要怎么用呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马