zoukankan      html  css  js  c++  java
  • Android开发中常见的设计模式(一)——单例模式

    首先了解一些单例模式的概念。

    确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
    

    这样做有以下几个优点

    • 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中。
    • 保持程序运行的时候该中始终只有一个实例存在内存中

    其实单例有很多种实现方式,但是个人比较倾向于其中1种。可以见单例模式

    代码如下

    public class Singleton {
        private static volatile Singleton instance = null;
    
        private Singleton(){
        }
     
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    

    要保证单例,需要做一下几步

    • 必须防止外部可以调用构造函数进行实例化,因此构造函数必须私有化。
    • 必须定义一个静态函数获得该单例
    • 单例使用volatile修饰
    • 使用synchronized 进行同步处理,并且双重判断是否为null,我们看到synchronized (Singleton.class)里面又进行了是否为null的判断,这是因为一个线程进入了该代码,如果另一个线程在等待,这时候前一个线程创建了一个实例出来完毕后,另一个线程获得锁进入该同步代码,实例已经存在,没必要再次创建,因此这个判断是否是null还是必须的。

    而在Android中,很多地方用到了单例。比如EventBus中的单例

    private static volatile EventBus defaultInstance;
    public static EventBus getDefault() {
    	if (defaultInstance == null) {
    		synchronized (EventBus.class) {
    			if (defaultInstance == null) {
    				defaultInstance = new EventBus();
    			}
    		}
    	}
    	return defaultInstance;
    }
    
  • 相关阅读:
    windows已经阻止此软件因为无法验证发行者解决方案
    vs用resharp如何调试到源码而不是对象浏览器
    Android环境变量的设置(详细图解版)
    js为xml添加节点和属性
    javascript操作xml文件综合实例
    js如何循环读取xml文件的节点
    游标的简单理解
    关于DATE函数datediff dateadd datename等
    分组数据where & having ,group by & order by
    SQL拼接字段,算数计算
  • 原文地址:https://www.cnblogs.com/xl-phoenix/p/9252254.html
Copyright © 2011-2022 走看看