设计模式(五)单例模式

顾名思义,利用单例模式我们可以让一个类在应用启动后,只会产生一个实例对象。经常应用于创建连接池、线程池的场景

单例模式

定义

单例模式确保一个类只有一个实例,并提供一个全局访问点

实现代码

由于单例模式只涉及到一个类,这里就不画UML图了,直接看一下代码。
考虑线程安全的单例模式一般有两种形式,1. 迫切单例模式;2. 懒加载单例模式

迫切单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.luhuancheng.pattern.singleton;

/**
* 迫切的单例模式,在类加载的时候直接创建实例
* created by luhuancheng on 2018/10/26
*/
public class UrgentlySingleton {

// 私有化构造器,让外部无法实例化该类
private UrgentlySingleton() {}

// 静态常量在类加载器期间进行初始化,因此该写法为"迫切"单例模式
private static final UrgentlySingleton INSTANCE = new UrgentlySingleton();

// 提供一个获取实例的入口点
public static UrgentlySingleton getInstance() {
return INSTANCE;
}

}

懒加载单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.luhuancheng.pattern.singleton;

/**
* created by luhuancheng on 2018/10/26
*/
public class LazySingleton {

// volatile 保证了变量instance的修改,对于其他线程可见
private volatile static LazySingleton instance;

public static LazySingleton getInstance() {
// 只在第一次获取实例时,进行同步。提高性能
if (instance == null) {
synchronized (LazySingleton.class) {
instance = new LazySingleton();
}
}
return instance;
}
}

总结

  1. 单例模式确保程序中一个雷最多只有一个实例
  2. 确定在性能和资源上的取舍,来决定选择迫切单例(对性能有要求,对资源无要求的情况下选择)、懒加载单例(对性能无要求,对资源有要求的情况下选择)

源码地址

design_pattern_learn