Overview

所有单例模式的实现都包含:

  • 将构造函数设为私有,这样外部无法通过 new 进行构造.
  • 新建一个静态构建方法作为构造函数。 该函数会“偷偷”调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。此后所有对于该函数的调用都将返回这一缓存对象。

Pseudocode

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
class Database {
private static Database instance;

// 构造函数必须被设置为私有的,防止外部调用
private Database() {}

public static Database getInstance() {
if (Database.instance == null) {
acquireLock();
// 确保在等待锁期间,其他线程没有初始化单例对象
if (Database.instance == null) {
Database.instance = new Database();
}
}

return Database.instance;
}

// 一些方法
public void someQuery() {}
}

// 主程序:foo 和 bar 是同一个 Database 对象
Database foo = Database.getInstance();
foo.someQuery();

Database bar = Database.getInstance();
bar.someQuery();