单例模式
http://www.ibm.com/developerworks/cn/java/j-dcl.html
定义:
Ensure a class has only one instance, and provide a global point of access to it.
确保某个类只有一个实例,并提供一个全局访问点。
类图:
public class Singleton{
private static final Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){ //1
instance = new Singleton();//2
}
return instance; //3
}
...
}
优点:
- 内存中只有一个对象,减少内存开支;
- 单例可避免对资源的多重占用,例如写文件动作,可避免对同一资源文件的同时写操作。
缺点:
- 单例模式一般没有接口,扩展很困难; ——单例并不是用来继承的。
- 不利于测试,并行开发时,若单例未完成,则不能进行测试;
- 与单一职责原则冲突,把“要单例”和业务逻辑融合在一个类中。
使用场景:
若出现多个对象就会出现“不良反应”,应该用单例,具体场景如下:
- 要求生成唯一序列号的环境;
- 在整个项目中需要一个共享访问点或共享数据。例如页面计数器;
- 创建一个对象需要消耗的资源过多时;
- 需要定义大量的静态常量和静态方法的环境。
为什么不直接用全局变量来实现单例?
有缺点:全局变量必须在程序一开始就创建好。而单例模式可以延迟初始化。
类加载器对单例的影响:
不同的类加载器可能会加载同一个类。
如果程序有多个类加载器,可在单例中指定某个加载器,并指定同一个加载器。