创建型设计模式-单例模式

91 阅读1分钟
定义
某个类只能生成一个实例,该类提供了一个全局访问点,供外部获取该实例,其拓展是有限多个实例。
单例设计模式的几种实现

1.饿汉式

/**
 * 饿汉式
 * (无法向单例对象的构造方法传递参数)
 */
public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }

}

2.懒汉式

/**
 * 懒汉式(延迟加载)
 *  多线程的时候会出现问题
 */
public class Singleton {

    private static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){
        if (instance==null){
            instance = new Singleton();
        }
        return instance;
    }
    
}

3.双重检测,在framework中基本都是用的这种,但是一般都不使用volatile关键字

/**
 *  双重检测
 */
public class Singleton {
    //volatile 线程并发时,当变量被改动了,所有的线程都能即时访问到最新的数据
    // 会屏蔽掉虚拟机的一些代码优化
    private volatile static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance() {
        if (instance==null){
            synchronized (Singleton.class){
                if(instance==null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

4.静态内部类

/**
 * 静态内部类(不能传递参数)
 * 可以延迟加载,也能线程安全
 */
public class Singleton {

    private Singleton(){}

    private static class SingletonHolder{
        //静态内部类的静态属性实例化时,由JVM保证线程的安全
        private static Singleton instance = new Singleton();
    }

    /**
     * 只有掉用了getInstance方法之后,才会实例化 Singleton instance 属性
     * @return
     */
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }

}

5.枚举(是比较推荐的一种)

public enum Singleton {

   instance;

   public void operate(){
       System.out.println("处理中。。。。。。");
   }

}