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;
    }
}

 

posted @ 2016-12-27 11:53  郭鑫  阅读(225)  评论(0编辑  收藏  举报