上次我们讲到迭代器模式(设计模式——迭代器模式),这次我们来看一个最常用的设计模式——单例模式。单例模式的使用场景很多,比如处理偏好和设置注册表对象、日志对象、对话框等。单例模式是应用最广的设计模式之一,也是很多同学最熟悉的模式,因为它使用简单,很好理解,在一般情况下使用都不会出什么问题。但是如果深入去理解的话,还是会发现有些平时没注意到的问题的,下面就一起学习下巩固下吧。
一、定义
单例模式:确保一个类只有一个实例,而且自行实例化,并向整个系统提供这个实例。
二、UML类图
单例模式UML类图如下:
- Client:客户端,使用单例类。
- Singleton:单例类。
单例模式的UML图很简单,我们主要的关注点在单例类上。有几个注意点:1⃣,构造方法不对外开放,一般为private,这样就能保证客户端不能new一个单例类实例;2⃣,通过一个静态方法或者枚举返回单例对象;3⃣,确保单例类对象只有一个,特别是在多线程的情况下,这个尤为重要的,这一点也将是我们后面着重讲的;4⃣,确保单例类对象在反序列化时不会重新构建对象,这一点在要实现单例类序列化的情况下要多留意。
三、实例
单例模式的写法也很多种,我们针对一些常见的来一一解释下。
- 首先见的最多的应该是这个,我们这里称它为version1.0:
public class Singleton {
private static Singleton mInstance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (mInstance == null)
mInstance = new Singleton();
return mInstance;
}
}
这个应该是最好理解的。首先定义一个Singleton的实例mInstance,这实例就是提供给客户端的,通过静态方法getInstance()返回该实例;然后定义的私有构造方法