代码示例:https://github.com/elfc/patterns
分类
创建型
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
动机
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机,只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A/D转换器。一个会计系统只能专用于一个公司。
我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。
一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。
适用性
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
结构
参与者
- Singleton
-- 定义一个Instance操作,允许客户访问它的唯一实例。
效果
- 对唯一实例的受控访问
- 缩小名空间
- 允许对操作和表示的精化
- 允许可变数目的实例
代码示例
/**
* @author chunyuliu
*/
public class Singleton {
/**
* 避免直接使用static final 导致类加载时就创建对象
* 静态内部类只会被加载一次,解决线程安全问题
*/
private static class Instance {
private static Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return Instance.INSTANCE;
}
}
/**
* @author chunyuliu
*/
public class SingletonTest {
@Test
public void singletonInstanceTest() {
System.out.println("Instance 1: " + Singleton.getInstance());
System.out.println("Instance 2: " + Singleton.getInstance());
}
}