美文网首页设计模式
单例模式(Singleton)

单例模式(Singleton)

作者: 秀儿2020 | 来源:发表于2020-07-18 14:42 被阅读0次

    定义

    保证一个类只有一个实例,并提供一个访问它的全局访问点。

    把创建实例的权限收回,让类自身负责类实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法。

    本质

    控制实例数量

    登场角色

    • Singleton

      负责创建Singleton类自己的唯一的实例,并提供一个getSingleton方法来让外部访问这个唯一实例。

    单例模式的实现方式

    饿汉式
    /**
     * 饿汉式
     * 应用在创建和使用实例开销不大的场景
     */
    public class Singleton1 {
        private Singleton1(){}
        public static Singleton1 singleton1 = new Singleton1();
    
        public static Singleton1 getInstance(){
            return singleton1;
        }
    }
    
    懒汉式
    /**
     * 懒汉式
     * 创建开销较大,所以延迟实例化,在用到时才会去创建实例
     */
    public class Singleton2 {
        private Singleton2(){}
        private static Singleton2 singleton2;
        //双重检查模式,弊端在于由于JVM的指令重排序,使得调用时可能会返回空对象
        public static Singleton2 getInstance(){
            if(singleton2 == null){
                synchronized (Singleton2.class){
                    if(singleton2 == null){
                        singleton2 = new Singleton2();
                    }
                }
            }
            return singleton2;
        }
    }
    
    静态内部类
    /**
     * 静态内部类的实现方式
     */
    public class Singleton3 {
        private Singleton3(){}
        private static class Singleton3Handler{
            private static Singleton3 singleton3 = new Singleton3();
        }
        public static Singleton3 getInstance(){
            return Singleton3Handler.singleton3;
        }
    }
    
    枚举
    /**
     * 枚举
     */
    public enum  Singleton4 {
        SINGLETON_4;
        public static Singleton4 getInstance(){
            return SINGLETON_4;
        }
    }
    

    功能

    用来保证一个类在运行期间只有一个实例,并提供了一个全局的访问点。只关心类的创建问题。

    何时使用

    当需要控制一个类的实例只有一个时。

    相关文章

      网友评论

        本文标题:单例模式(Singleton)

        本文链接:https://www.haomeiwen.com/subject/djtfkktx.html