美文网首页
单例模式的多重实现

单例模式的多重实现

作者: 可乐爱吃薯片 | 来源:发表于2019-05-20 23:09 被阅读0次

概述:单例模式这种类型属于对象创建型模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点.
​理解:某些类创建对象是非常复杂与时耗内存,这种类创建的对象我们称之为重量级对象。如果需要使用重量级重量级类,一般把这个类设计为单例对象模式,好处有:
​1)保证对象再内存中仅有一个,减少内存开销
2)使用着不需要考虑创建细节,使用方便
懒汉式:延迟创建(调用的时候创建)、线程不安全

public class SingletonClass {
    //保存唯一的实例
    private static SingletonClass ONLY;
    //屏蔽外部的new
    private SingletonClass(){
        
    }
    //提供一个全家的访问点
    public synchronized static SingletonClass getInstance(){
        if(ONLY==null){
            //...
            ONLY=new SingletonClass();
        }
        //...其他代码
        return ONLY;
    }
    public void f(){
        System.out.println("hahaha");
    }
    
}

饿汉式:立即创建、线程安全、没有延迟

public class SingletonClass {
    //创建唯一的实例
    private static final SingletonClass ONLY=new SingletonClass();
    //屏蔽外部的new
    private SingletonClass(){
        
    }
    //提供一个全家的访问点
    public static SingletonClass getInstance(){
        //...其他代码
        return ONLY;
    }
    public void f(){
        System.out.println("hahha");
    }
}

双重验证:延迟加载、线程安全、同步情况下效率高、实现复杂

public class SingletonClass {
    //保存唯一的实例
        private static SingletonClass ONLY;
        //屏蔽外部的new
        private SingletonClass(){
            
        }
        //提供一个全家的访问点
        public  static SingletonClass getInstance(){
            if(ONLY==null){
                //B
                synchronized (SingletonClass.class) {
                    if(ONLY==null){ 
                        //A
                        ONLY=new SingletonClass();
                    }
                }
            }
            //...其他代码
            return ONLY;
        }
        public void f(){
            System.out.println("hahha");
        }
}

类加载式:延迟加载、线程安全、同步情况下效率高、实现简单

public class SingletonClass implements Serializable,Cloneable{
    
    //屏蔽外部的new
    private SingletonClass(){
        
    }
    //静态内部类,用于持有唯一的SingletonClass的示例
    private static class OnlyInstanceHolder{
        
        static private SingletonClass ONLY=new SingletonClass();
    }
    //公开的唯一访问点
    public static SingletonClass getInstance(){
        return OnlyInstanceHolder.ONLY;
    }
    //自定义反序列化返回的对象
    private Object readResolve() throws ObjectStreamException{
        return getInstance();
    }
    //克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return getInstance();
    }
}

枚举方式:立即加载、线程安全、实现简单、防止反序列化

public enum SingletonClass {
    INSTANCE;
    public void f(){
        System.out.println("SingletonClass.f()");
    }
}

总结:一般情况下,应该使用饿汉式(第一种方式)。如果需要延迟加载,推荐使用类加载方式。如果需要非常标准的单例模式(不能new,不能被反序列化时),推荐使用枚举实现。如果单例对象在创建过程中其他特殊的需求,可以考虑使用双重验证方式。

相关文章

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 单例模式

    一、实现单例模式 或者 二、透明的单例模式 三、用代理实现单例模式 四、JavaScript中的单例模式 在Jav...

  • python面试题-2018.1.30

    问题:如何实现单例模式? 通过new方法来实现单例模式。 变体: 通过装饰器来实现单例模式 通过元类来创建单例模式...

  • 单例模式的多重实现

    概述:单例模式这种类型属于对象创建型模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点.​理解:某些类创建...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • 单例模式

    单例模式及C++实现代码单例模式4种实现详解 c++11改进我们的模式之改进单例模式 单例模式(Singleton...

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • 单例模式

    饿汉模式: 懒汉模式: Double CheckLock(DCL)实现单例 静态内部类实现单例 枚举单例 使用容器...

  • iOS 单例

    单例模式实现不能使用继承 定义单例实现 简写 定义单例实现宏

网友评论

      本文标题:单例模式的多重实现

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