单例模式
一、定义
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
二、类图
三、通用模板代码
public class Singleton{
private static final Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
public static void doSomething(){
}
}
四、单例模式的应用
优点
- 减少内存开销,优化和共享资源的访问
缺点
- 没有接口,拓展困难
- 测试不利,无法使用mock
使用场景
- 要求生成唯一序列号的环境
- 整个项目中需要一个共享访问点或共享数据
- 创建一个对象需要消耗的资源过多
- 需要定义大量的静态常量和静态方法(如工具类)的环境
懒汉与饿汉
懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。通用模板便是如此。
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式当并发量较大时可能在内存中出现多个实例,破坏了最初的预期,这种情况可以使用synchronized关键字。
在使用单例模式时更推荐饿汉模式。