Technology-设计模式-单件模式

本文介绍了GoF中的单件模式。

模式推演

当需要保证某个对象独一无二时:

有时候,我们需要保证某个对象是独一无二的,例如针对锁,我们需要保证钥匙是唯一的,为了控制类的初始化,我们将构造函数设置为private,然后提供一个方法专门用于初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Singleton{
private static Singleton uniqueInstance;

private Singleton(){
}

public getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}

乍看之下,没什么问题,但是在多线程中,依然可能导致创造多个对象,需要进一步优化。

注意多线程:

为了规避多线程并发导致的,创造多个对象的问题,加上保护,首先,将静态变量设置为volatitle,保证每次从内存读取,而不是从寄存器缓存中读取,其次,在创建的时候,加上锁:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Singleton{
private volatitle static Singleton uniqueInstance;

private Singleton(){
}

public getInstance(){
if(uniqueInstance == null){
synchronized(Singleton.class){
if(uniqueInstance == null)
uniqueInstance = new Singleton();
}
}
return uniqueInstance;
}
}

这种设计方式就是单件模式,与直接使用静态全局变量的区别在于,单件可以在被使用到的时候才创建对象,并且静态全局变量不能保证只有一个,有可能创造了多个实例,再重新复制给静态全局变量。

还需要注意的是,如果有多个类加载器(Class Loader),那可能会存在多个单件,解决办法就是自行指定同一个类加载器。

定义

单件模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

类图:

Technology-DesignPattern-Singleton-Class