Java设计模式之单例设计模式总结
package singleton; /**单例设计模式 饿汉式 * * @author gx *这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化, *虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, * 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载, * 这时候初始化instance显然没有达到lazy loading的效果。 */ public class Ehan { private static Ehan instance=new Ehan(); private Ehan(){} public static Ehan getInstance(){ return instance; } } package singleton; /**单例设计模式饿汉式 变种 * 类初始化即实例化instance。 * @author gx * */ public class EhanVarietal { private static EhanVarietal instance=null; static{ instance=new EhanVarietal(); } private EhanVarietal(){} public static EhanVarietal getInstance(){ return instance; } } package singleton; /** * 单例设计模式懒汉式,线程不安全 * @author gx * 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 */ public class LanHan { private static LanHan instance; // 私有构造方法 private LanHan() { } // 提供公有的外部构造方法 public static LanHan getInstance() { if (instance != null) { instance = new LanHan(); } return instance; } } package singleton; /**单例设计模式 懒汉式 线程安全 * * @author gx * 这种写法能够在多线程中很好的工作, * 而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。 */ public class LanHanSafety { private static LanHanSafety instance; private LanHanSafety(){} public static synchronized LanHanSafety getInstance(){ if(instance==null){ instance=new LanHanSafety(); } return instance; } } package singleton; /**单例设计模式 枚举类型 * * @author gx * */ public enum MeiJu { INSTANCE; private String name; private int age; private MeiJu(){} public void whateverMethod(){} public static MeiJu getInstance(){ return INSTANCE; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return this.name+"-----"+this.age; } } package singleton; /**单例设计模式 静态内部类 * * @author gx * */ public class StaticInnerClass { private static class StaticInnerClassHolder{ private static final StaticInnerClass INSTANCE=new StaticInnerClass(); } private StaticInnerClass(){} public static StaticInnerClass getInstance(){ return StaticInnerClassHolder.INSTANCE; } } package singleton; /** * 单例设计模式 双重验锁 * * @author gx * */ public class YanSuo { private volatile static YanSuo instance; private YanSuo() { } public static YanSuo getInstance() { if (instance == null) { synchronized (YanSuo.class) { if (instance == null) { instance = new YanSuo(); } } } return instance; } }