一、定义
单例模式是android开发应用最多的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到,如多个模块使用同一个数据源连接对象等等;
需要注意的是:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例
二、优势
1、由于单例模式在内存中只有一个实例,所以可以减少内存开销,特别是一个对象咱们需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,这时单例模式的优势就非常明显;
2、可以避免对资源的多重占用,避免对同一资源进行多种操作;
3、单例模式可以在系统设置全局的访问点,优化和共享资源访问;
三、缺点
1、单例采用静态方法,无法在继承结构中使用;
2、不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态;
3、可能的开发混淆,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类;
四、常用实现方式
(1)饿汉式
// 在类被加载进入内存的时候就创建单一的Person对象
private static Person mPerson=new Person();
// 构造函数私有化
private Person() {
}
// 提供一个全局的静态方法
public static Person new Instance() {
return mPerson;
}
特点:声明静态对象的时候进行初始化静态对象,以后不再改变,天生是线程安全,同时饿汉式是最简单的实现方式,这种实现方式适合那些在初始化时就要用到单例的情况,这种方式简单粗暴,如果单例对象初始化非常快,而且占用内存非常小的时候这种方式是比较合适的,可以直接在应用启动时加载并初始化。弊端:消耗资源。
(2)懒汉式单例
public class Person {
//私有的构造函数
private Person() {
}
//私有的静态变量
private static Person mPerson=null;
//暴露的公有静态方法
public static Person getInstance() {
if(mPerson==null) {
mPerson=new Person();
}
return mPerson;
}
}
特点:懒汉式与饿汉式的最大区别就是将单例的初始化操作,优势在于延迟加载,这样做在某些场合中有很大用处。弊端:线程不安全。