美文网首页
单例模式

单例模式

作者: 附庸风雅_ | 来源:发表于2018-01-27 17:39 被阅读0次

    定义

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

    场景

    例:现在要开发一个程序,接收各种传感器的回馈,这时我们就可以考虑使用单例模式了,在单例中实现传感器的监听注册、回调接口

    代码

    回调方法

    public class AppCore {
    
        public void onStateResponseA(State state){};
    
        public void onStateResponseB(State state){};
    
        public void onStateResponseC(State state){};
    }
    

    单例

    public class AppManage {
    
        private List<WeakReference<AppCore>> mCallBacks = null;
    
        public static AppManage getInstance() {
            return AppCoreManageImlHolder.instance;
        }
    
        private static class AppCoreManageImlHolder {
            private static AppManage instance = new AppManage();
        }
        private AppManage() {
            init();
        }
    
        private void init() {
            if (mCallBacks == null) {
                mCallBacks = new ArrayList<WeakReference<AppCore>>();
            }
        }
    
        /**
         * 注册回调
         * @param cb
         * @return
         */
        public boolean register(@NonNull AppCore cb) {
            boolean result = false;
            if (!isRegister(cb)) {
                mCallBacks.add(new WeakReference<AppCore>(cb));
                result = true;
            }
            return result;
        }
    
        /**
         * 注销回调
         * @param cb
         * @return
         */
        public boolean remove(@NonNull AppCore cb) {
            boolean result = false;
            for (int i = mCallBacks.size() - 1; i >= 0; i--) {
                if (mCallBacks.get(i).get() == cb) {
                    mCallBacks.remove(i);
                    result = true;
                    break;
                }
            }
            return result;
        }
    
        private boolean isRegister(AppCore cb) {
            int size = mCallBacks.size();
            for (int i = 0; i < size; i++) {
                if (mCallBacks.get(i).get() == cb) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 当接收到状态时可以调用此方法下发
         * @param state
         */
        public void handlerState(State state) {
            int size = mCallBacks.size();
            for (int i = 0; i < size; i++) {
                AppCore cb = mCallBacks.get(i).get();
                if (cb != null) {
                    cb.onStateResponseA(state);
                }
            }
        }
    }
    

    注册/销毁回调

    public class MainActivity extends Activity {
    
        private AppManage mAppManage;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mAppManage = AppManage.getInstance();
            mAppManage.register(mCallBack);
    
        }
    
        AppCore mCallBack = new AppCore() {
            @Override
            public void onStateResponseA(State state) {
                super.onStateResponseA(state);
            }
    
            @Override
            public void onStateResponseC(State state) {
                super.onStateResponseC(state);
            }
        };
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mAppManage.remove(mCallBack);
        }
    }
    

    上面是关于单例的简单用法,用的是静态内部类单例模式,这种写法由JVM来保证线程的安全性,优点是:

    • 延迟加载
    • 线程安全
      除此之外还有:
    • 懒汉模式
    • 饿汉模式
    • DCL
      但目前最流行的写法还是静态内部类单例模式,所以关于这几种模式在这里就不讲了

    相关文章

      网友评论

          本文标题:单例模式

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