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;
    }
    
  • 相关阅读:
    计算字符个数
    字符串最后一个单词的长度
    C++面试宝典
    给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码
    N-皇后问题(N Queens)
    图着色算法详解(Graph Coloring)
    c++学习路线连接
    数据结构--经典排序算法
    5. 最长回文子串
    4. 寻找两个有序数组的中位数
  • 原文地址:https://www.cnblogs.com/xl-phoenix/p/9252254.html
Copyright © 2011-2022 走看看