单例应用场景
全局唯一实例,Android的application对象等
单例的示例
饿汉模式
public class HungrySingleton {
//
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
// 隐藏构造函数
}
// 单例接口
public static HungrySingleton getInstance() {
return instance;
}
}
懒汉模式
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
private static LazySingleton getInstance() {
if (instance != null) {
instance = new LazySingleton();
}
return instance;
}
}
基于单线程模型设计,涉及到多线程问题时,可能重复创建对象。
考虑线程安全的单例模式
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
private static synchronized LazySingleton getInstance() {
if (instance != null) {
instance = new LazySingleton();
}
return instance;
}
}
双重锁机制的懒汉
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
private static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
先进行判空避免不必要的同步,再次判空创建对象实例。
单例的实现还有很多方法,但是目前只掌握了这三种写法,每种方法都有其局限性,仁者见仁智者见智吧。
单例在Android中的应用
仔细阅读android 的源码发现在uiautomator中的UiDevice 就是通过单例实现的,通过唯一实例对屏幕进行操作。在Android的开发中弹框、系统服务都需要依赖上下文环境,在Android中Application是唯一的实例对象,详见Application源码部分。可以定制化自有的Application类,管理全局的Context。
import android.app.Application;
public class MainApplication extends Application {
public static MainApplication instance;
public static MainApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
instance = this;
}
}