自我成长之单例

单例应用场景

全局唯一实例,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;
	}

}

值得注意的是 不需要new 一个Application对象!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值