设计模式之单例模式(三种实现方式)
一、单例模式要点
1.单例,顾名思义,某个类只能有一个实例。
2.它必须自行创建这个唯一的实例。
3.它必须自行向整个系统提供这个实例。
二、单例模式的三种实现
1.饿汉式单例类(类加载时就初始化)
public class EagerSingleton {//私有的类成员常量private static final EagerSingleton SINGLETON=new EagerSingleton();//私有的默认构造方法,此类不能被继承private EagerSingleton(){}//静态工厂方法public static EagerSingleton getInstance(){return SINGLETON;}} public class LazySingleton {private static LazySingleton singleton=null;//私有的默认构造方法,此类不能被继承private LazySingleton(){}//同步,静态工厂方法,返回此类的唯一实例public synchronized static LazySingleton getInstance(){if(singleton==null){singleton=new LazySingleton();}return singleton;}}public class DoubleCheckSingleton {private volatile static DoubleCheckSingleton singleton = null;// 私有的默认构造方法,此类不能被继承private DoubleCheckSingleton() {}// 静态工厂方法,返回此类的唯一实例public static DoubleCheckSingleton getInstance() {if (singleton == null) {synchronized (DoubleCheckSingleton.class) {if (singleton == null) {singleton = new DoubleCheckSingleton();}}}return singleton;}} package com.zzs.singleton;import java.util.HashMap;public class RegSingleton {private static HashMap registry=new HashMap();/**静态代码块 *静态代码块优先于主方法执行,而在类中定义的静态代码会优先于构造块执行,而且不管产生多少对象,静态代码块只执行一次。 */static{RegSingleton singleton=new RegSingleton();registry.put(singleton.getClass().getName(), singleton);}protected RegSingleton(){}public static RegSingleton getInstance(String name){if(name==null){name="com.zzs.singleton.RegSingleton";}if(registry.get(name)==null){try {registry.put(name, Class.forName(name).newInstance());} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return (RegSingleton) registry.get(name);}}package com.zzs.singleton;public class RegSingletonChild extends RegSingleton {//由于子类必须允许父类以构造方法调用产生实例,所以它的构造方法必须是公开的,protected或publicprotected RegSingletonChild() {} //静态方法工厂public static RegSingletonChild getInstance() {return (RegSingletonChild) RegSingleton.getInstance("com.zzs.singleton.RegSingletonChild");}}