Java 设计模式

1. 单例模式

1. 静态内部类、嵌套类

1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton {
// 1. 禁构造函数
private Singleton() {}
// 2. 创建静态内部类,在其中实例化单例类
private static class Holder {
private static Singleton instance = new Singleton();
}
// 3. 获取实例化静态单例类变量
public static Singleton getInstance() {
return Holder.instance;
}
}

2. 枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 创建 */
enum Singleton {
INSTANCE;
public void otherMethods(){
System.out.println("Something");
}
}

/* 使用 */
public class Hello {
public static void main(String[] args) {
Singleton.INSTANCE.otherMethods();
}
}

3. 饿汉模式

1
2
3
4
5
6
7
8
9
10
public class Singleton {
// 1. 禁构造函数
private Singleton() {}
// 2. 设置私有静态单例类变量,直接实例化
private static Singleton instance = new Singleton();
// 3. 获取实例化静态单例类变量
public static Singleton getInstance(){
return instance;
}
}

4. 懒汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
// 1. 禁构造函数
private Singleton() {}
// 2. 设置私有静态单例类变量,但不需要实例化
private static Singleton instance;
// 3. 获取实例化静态单例类变量,直接锁方法
public static synchronized Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

5. 双重校验、饱汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Singleton {
// 1. 禁构造函数
private Singleton() {}
// 2. 设置私有静态单例类变量,但不需要实例化,注意 volatile
private static volatile Singleton instance;
// 3. 获取实例化静态单例类变量
public static Singleton getInstance() {
// 3.1. 判断有无
if (instance == null) {
// 3.2. 类上加锁
synchronized (Singleton.class) {
// 3.3. 再判断有无
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}