Java 设计模式之单例模式(内部类实现单例)

2019-05-07  本文已影响0人  BeijingIamback

何时使用单例模式
当需要控制一个类的实例只有一个, 而且客户只能从一个全局访问点去访问她。

经典的单例模式有两种,懒汉式饿汉式,各自都有各自的缺点,使用内部类能更好的完成,延迟加载和线程安全。


public class Singleton {
    /***
     * 类的内部类,也就是静态成员的内部类,该内部类的实例与外部类的实例没有绑定关系
     * 只有被调用的时候才会装载,从而实现了延时加载
     *
     */
    public static class SingletonHolder {
        /**
         * 静态初始化器,JVM保证线程安全
         */
        private static Singleton instance = new Singleton();
    }
    /**
     * 私有化构造方法
     */
    private Singleton(){
        
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

当getInstance方法第一次被调用的时候,她第一次读取SingletonHolder.instance,导致SingletonHolder类被初始化,而这个类在装载并初始化的时候会初始化他的静态域,从而创建singleton实例,由于是静态的域,所以只会在虚拟机装载类的时候加载一次,并由虚拟机保证她的线程安全
这个模式的优势在于,getInstance并没有被同步,并且只执行一个域的访问,因此延迟初始化并没有增加访问成本。

还可以尝试使用单元素的枚举,来实现singleton,只要编写一个单元素的枚举类型即可。

摘抄来自:研磨设计模式
上一篇 下一篇

猜你喜欢

热点阅读