java单例模式

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

//饿汉式单例类.在类初始化时,已经自行实例化 
 public class Singleton1 {
     //私有的默认构造子
     private Singleton1() {}
     //static 修饰  类初始化时创建唯一实例 
     private static final Singleton1 single = new Singleton1();
     //静态工厂方法 
     public static Singleton1 getInstance() {
         return single;
     }
 }

 

//懒汉式单例类.在第一次调用的时候实例化 
 public class Singleton2 {
     //私有的默认构造子
     private Singleton2() {}
     //注意,这里没有final    
     private static Singleton2 single=null;
     //静态工厂方法 
     public synchronized  static Singleton2 getInstance() {
          if (single == null) {  
              single = new Singleton2();
          }  
         return single;
     }
 }

 

import java.util.HashMap;
import java.util.Map;

//登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的
//类似Spring里面的方法,将类名注册,下次从里面直接获取。

public class RegSingleton {
    private static Map<String, RegSingleton> map = new HashMap<String, RegSingleton>();

    static {
        RegSingleton single = new RegSingleton();
        map.put(single.getClass().getName(), single);
    }

    //默认构造 保护
    protected RegSingleton() {
    }

    //静态工厂方法,返还此类惟一的实例
    public static RegSingleton getInstance(String name) {
        if (name == null) {
            name = RegSingleton.class.getName();
        }
        if (map.get(name) == null) {
            try {
                map.put(name, (RegSingleton) Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return map.get(name);
    }

    public String about() {
        return "Hello, I am RegSingleton.";
    }

    public static void main(String[] args) {
        RegSingleton single = RegSingleton.getInstance(null);
        System.out.println(single.about());
        System.out.println(RegSingletonChild.getInstance().about());
    }

}

 

public class RegSingletonChild extends RegSingleton {

    public RegSingletonChild() {
    }

    /**
     * 静态工厂方法
     */
    static public RegSingletonChild getInstance() {
        return (RegSingletonChild)RegSingleton.getInstance(RegSingletonChild.class.getName());
    }

    public String about() {
        return "Hello, I am RegSingletonChild.";
    }

}

 

posted @ 2015-04-10 11:34  huonan  阅读(167)  评论(0编辑  收藏  举报