单例模式保证为一个类生成唯一的实例对象;
Android中 Application 可以说是单例模式的一个类;
- 优点:
实例时,只需调用一个单一的方法即可生成一个唯一的实例,节约资源,减少内存开销;
避免对资源的多重占用;- 缺点:
很难实现序列化,导致很难被持久化,也难通过网络传输;
由于单例采用静态方法,无法在继承结构中使用
/**
* Created by curry on 2017/8/9
* 单例模式
*/
public class Singleton {
private Singleton() {
}
/**
* 饿汉式 : 适合初始化时就要用到单例的情况;适合初始化速度快(操作少),占用非常小的内存情况
* <p>
* 多线程下不会出现问题,因为JVM只会实例一个单例类
*/
private static Singleton mSingleton = new Singleton();
public static Singleton newInstance() {
return mSingleton;
}
/**
* 懒汉式 : 适合有耗时操作,占用内存大,对启动速度有要求,只在特定场景使用一般不用的情况 可以延时加载单例
* <p>
* 多线程下会出现问题,可能会创建多个单例
*/
private static Singleton mSingleton = null;
public static Singleton newInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();
}
return mSingleton;
}
/**
* 方案一:
* 解决实现 : 线程安全 和 延时加载
* <p>
* 通过实现内部类,这样加载单例时就不会再重新实例
*/
private static class SingletonHolder {
private static Singleton mSingleton = new Singleton();
}
public static Singleton newInstance() {
return SingletonHolder.mSingleton;
}
/**
* 方案二:双重校验锁
* 加同步锁,来解决多线程问题
*/
private static volatile Singleton mSingleton = null;
public static Singleton newInstance() {
if (mSingleton == null) {
synchronized (Singleton.class) {
if (mSingleton == null) {
mSingleton = new Singleton();
}
}
}
return mSingleton;
}
public void doSomething() {
//Do something ...
}
}