创建型模式之单例模式 | 张扎瓦的博客

创建型模式之单例模式

单例模式介绍与写法


什么是单例模式

单例模式,顾名思义,单个实例的模式。保证一个类只有一个实例,并提供一个访问该实例的全局访问点。

为什么要有单例模式

在某些场景下,某个类只允许一个实例。如操作系统的资源管理器,任务管理器,读取配置文件的类等。如果一个操作系统有多个资源管理器,那系统就乱套了。项目中读取配置文件的类如果有多个,则会浪费不必要的内存空间。

常见的五种单例模式的实现

懒汉单例

懒汉单例模式,只有当使用到单例对象时,才会进行实例化操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Singleton1 implements Serializable{
/**
* 懒汉单例,具体使用时才会实例化(懒加载)
*/
private static Singleton1 instance;

/**
* 私有化构造器,防止通过new创建对象
*/
private Singleton1() {
//防止通过反射创建对象
if (instance != null) {
throw new RuntimeException("重复创建单例对象");
}
}

/**
* 获取单例对象
* 延时加载,当使用对象时才实例化
*
* @return
*/
public synchronized static Singleton1 getInstance() {
if (instance == null) {
instance = new Singleton1();
}

return instance;
}

/**
* 防止反序列化时创建新对象
* @return
*/
private Object readResolve() {
return instance;
}
}

饿汉单例

饿汉单例模式,类初始化时立即实例化对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Singleton2 implements Serializable {

/**
* 饿汉单例模式,类初始化时创建对象
*/
private static Singleton2 instance = new Singleton2();

private Singleton2() {
//防止反射创建单例对象
if (instance != null) {
throw new RuntimeException("重复创建单例对象");
}
}

public static Singleton2 getInstance() {
return instance;
}

/**
* 防止反序列化创建新对象
* @return
*/
private Object readResolve() {
return instance;
}

双重检查锁式单例

jdk1.5之前,使用这种方式偶尔会有问题,不建议使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Singleton3 {
private static volatile Singleton3 instance;

private Singleton3() {
if (instance != null) {
throw new RuntimeException("重复创建单例对象");
}
}

/**
* 双重检查锁单例
* @return
*/
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}

return instance;
}

/**
* 防止反序列化创建新对象
* @return
*/
private Object readResolve() {
return instance;
}
}

静态内部类式单例

线程安全,调用效率高,延时加载,推荐使用这种方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Singleton4 implements Serializable {
/**
* 创建静态内部类
*/
private static class SingletonClassInstance {
private static final Singleton4 instance = new Singleton4();
}

/**
* 私有化构造方法
*/
private Singleton4() {
if (SingletonClassInstance.instance != null) {
throw new RuntimeException("重复创建单例对象");
}
}

public static Singleton4 getInstance() {
return SingletonClassInstance.instance;
}

/**
* 防止反序列化创建新对象
*
* @return
*/
private Object readResolve() {
return SingletonClassInstance.instance;
}
}

枚举单例

1
2
3
4
5
6
7
8
9
10
public enum Singleton5 {
INSTANCE;

/**
* 自定义操作
*/
public void operation() {

}
}
如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)