单例设计模式理解

2020-05-25  本文已影响0人  盐海里的鱼

单例:即只返回同一个构建对象的一种设计模式

1.最常见的单例:这是一种线程不安全的单例
//单例模式 线程不安全 可能产生不同的单例实例 
class Signle1{
    private static Signle1 mInstance;
    private Signle1(){}

    public static Signle1 getInstance(){
        if(mInstance==null){
            try {
                Thread.sleep(getRandom());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mInstance = new Signle1();
        }
        return mInstance;
    }

    public static long getRandom(){
        Random random = new Random();
        int max = 1000;
        int min =100;
        return random.nextInt(max)%(max-min+1)+min;
    }
}
78685c81fab57c4a2b89b0e1ce21321.png
2.饿汉式单例:
//饿汉式 单例模式 线程安全  适用场景 开销小 运行就需要创建时使用
class Single2{
    public static Single2 sInstance =new Single2();
    private Single2(){}

    public static Single2 getInstance(){
        try {
            Thread.sleep(getRandom());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return sInstance;
    }

    public static long getRandom(){
        Random random = new Random();
        int max = 1000;
        int min =100;
        return random.nextInt(max)%(max-min+1)+min;
    }
}
fd45cd716d311cf4ba67d612d5b352c.png
3.懒汉式单例: 可以在用到时再加载单例对象
//饿汉式 线程安全 
class Single3{
    //volatile 防止指令重排 使双重检查不失效
    private volatile static Single3 mInstance;

    private Single3(){}
    //锁住的资源太大
//    public synchronized static  Single3 getInstance(){
//        if(mInstance==null)
//            mInstance = new Single3();
//        return mInstance;
//    }
    //采用DCL 双重校验
    public static Single3 getInstance(){
        if(mInstance==null){
            synchronized (Single3.class){
                if(mInstance==null){
                    mInstance = new Single3();
                }
            }
        }
        return mInstance;
    }
}
e95da3e4e59025a7bfa9f3a15d4bcbc.png
5f161ff85956776be8a41c5c750a2b5.png
4.静态内部类单例:优点延迟加载
class Single4{
    private Single4(){}
    static class SigleHandler{
         public static   Single4 INSTANCE= new Single4();
    }
    public static Single4 getInstance(){
        return Single4.SigleHandler.INSTANCE;
    }
}
205b2809df47ee7fecb1fe7d2d5acb7.png
5.枚举构建单例:枚举本身就是线程安全的
//枚举单例
class Single5{
    private Single5(){}
     public  enum SingelDealer{
        SINGEL_DEALER;
        private  Single5 single5;
        private   SingelDealer(){
            single5 = new Single5();
        }

        public Single5 getSingle5(){
            return single5;
         }

    }
    public static Single5 getInstance(){
        return SingelDealer.SINGEL_DEALER.getSingle5();
    }
}
478f53d9c98be4dcb074cfed3caf078.png
6.容器单例:
//容器单例 安卓常用 getSystemService(NOTIFICATION_SERVICE)就是用这种模式
class Single6{
    private  static  HashMap<String,Object> mServiceList = new HashMap<>();
    public static void registerService(String key,Object service){
        if(!mServiceList.containsKey(key)){
            mServiceList.put(key,service);
        }
    }
    public static Object getService(String key){
        return mServiceList.get(key);
    }
}

上一篇 下一篇

猜你喜欢

热点阅读