一 单例模式介绍及它的使用场景
单例模式是应用最广的模式,也是我最先知道的一种设计模式,在深入了解单例模式之前,每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的实现。其实经常使用的图片加载框架ImageLoader的实例创建就是使用了单例模式,因为这个ImageLoader中含有线程池、缓存系统、网络请求,很消耗资源,不应该创建多个对象,这时候就需要用到单例模式。
ImageLoader的创建代码如下:
ImageLoader.getInstance();// 在自己的Application中创建全局实例
.....
//getInstance()执行的源码
public static ImageLoader getInstance() {
if(instance == null) {
//双重校验DCL单例模式
Class var0 = ImageLoader.class;
synchronized(ImageLoader.class) {
//同步代码块
if(instance == null) {
instance = new ImageLoader();//创建一个新的实例
}
}
}
return instance;//返回一个实例
}
因此,在我们创建一个对象需要消耗过多的资源时,便可以考虑使用单例模式。
二 单例模式的结构图以及创建的关键点?
单例模式的定义是它应该保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点。如下图是单例模式的结构图:
实现单例模式有以下几个关键点:
(1)其构造函数不对外开放,一般为private;
(2)通过一个静态方法或者枚举返回单例类对象;
(3)确保单例类的对象有且只有一个,尤其要注意多线程的场景;
(4)确保单例类对象在反序列化时不会重新创建对象;
通过将单例类的构造函数私有化,使得客户端不能通过new的形式手动构造单例类的对象。单例类会主动暴露一个公有的静态方法,客户端调用这个静态的方法获取到单例类的唯一实例。在获取这个单例类的时候需要确保这个过程是线程安全的。
三 单例模式的七种实现方式
(1)懒汉式(线程不安全)
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
//私有的构造函数
private