本文介绍了GoF中的单件模式。
模式推演
当需要保证某个对象独一无二时:
有时候,我们需要保证某个对象是独一无二的,例如针对锁,我们需要保证钥匙是唯一的,为了控制类的初始化,我们将构造函数设置为private,然后提供一个方法专门用于初始化:
1 | class Singleton{ |
乍看之下,没什么问题,但是在多线程中,依然可能导致创造多个对象,需要进一步优化。
注意多线程:
为了规避多线程并发导致的,创造多个对象的问题,加上保护,首先,将静态变量设置为volatitle,保证每次从内存读取,而不是从寄存器缓存中读取,其次,在创建的时候,加上锁:
1 | class Singleton{ |
这种设计方式就是单件模式,与直接使用静态全局变量的区别在于,单件可以在被使用到的时候才创建对象,并且静态全局变量不能保证只有一个,有可能创造了多个实例,再重新复制给静态全局变量。
还需要注意的是,如果有多个类加载器(Class Loader),那可能会存在多个单件,解决办法就是自行指定同一个类加载器。
定义
单件模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。
类图: