一:单例模式
单例模式:是一种对象创建型模式,用来确保程序中一个类最多只有一个实例,并提供访问这个实例的全局点。
单例模式解决以下类似问题:
- 如何样保证一个类只有一个实例?
- 如何轻松地访问类的唯一实例?
- 一个类如何控制它的实例化?
- 如何限制一个类的实例数量?
单例模式的解决方案:
- 隐藏类的构造方法,用
private
修饰符修饰构造方法. - 定义一个public的静态方法(
getInstance()
) ,返回这个类唯一静态实例。
2. 适用场景
以下场景可使用单例模式:
- 某些管理类,保证资源的一致访问性。
- 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
- 工具类对象;
- 频繁访问数据库或文件的对象。
Android:
-
Context.getSystemService()
-
KeyguardUpdateMonitor.getInstance(mContext)
-
Calendar.getInstance()
-
....
其他:
- 日志操作类
- 文件管理器
- 数据库的连接尺
- ...
3.实现方式
3.1 饿汉式
饿汉式,故名思议,很饿,所以在类加载的时候就直接创建类的实例。
/**
* Singleton class. Eagerly initialized static instance guarantees thread safety.
*/
public final class Singleton {
/**
* Private constructor so nobody can instantiate the class.
*/
private Singleton() {}
/**
* Static to class instance of the class.
*/
private static final Singleton INSTANCE = new Singleton();
/**
* To be called by user to obtain instance of the class.
*
* @return instance of the singleton.
*/
public static Singleton getInstance() {
return INSTANCE;
}
}
优点:
- 多线程安全
缺点:
- 内存浪费,类加载之后就被创建了实例,但是如果某次的程序运行没有用到,内存就被浪费了。
小结:
-
适合:单例占用内存比较小,初始化时就会被用到的情况。
-
不适合:单例占用的内存比较大,或单例只是在某个特定场景下才会用到
3.2 懒汉式
懒汉式,故名思议,很懒,需要用的时候才创建实例。
/**
* Singleton class. Eagerly initialized static instance guarantees thread safety.
*/
public final class Singleton {
/**
* Private constructor so nobody can instantiate the class.
*/
private Singleton() {}
/**
* Static to class instance of the class.
*/
private static final Singleton INSTANCE = null;
/**
* To be called by user to obtain instance of the class.
*
* @return instance of the singleton.
*/
public static Singleton getInstance() {
if (INSTANCE == null){
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
优点:
- 多线程安全
缺点:
- 执行效率低,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。
小结:
- 不建议使用此方法,后续介绍其他方法可兼顾内存和多线程安全.
3.4 线程安全的双重检查
优点:
- 多线程安全
注意点:
- jdk 1.5以下多线程安全不能实现
小结:
- 可使用此方法,兼顾内存和多线程安全.
3.5 静态内部类
优点:
- 多线程安全
注意点:
- jdk 1.5以下多线程安全不能实现
小结:
- 可使用此方法,兼顾内存和多线程安全.
二:代理模式
链接:http://blueskykong.com/2017/02/22/designproxy/
三:策略模式
链接:http://blueskykong.com/2017/03/22/designstrategy/