设计模式之单例模式详解
首先我们需要明白的是设计模式重要的是一种设计的思维,而不是单纯的代码,所以理解设计模式背后的思考方式才是重点
1、单例模式的核心作用
保证一个类只有一个实例,且有一个全局访问点可以访问这个实例
2、单例模式的常见的应用场景
1、servlet编程中,每个servlet都是单例
2、servlet编程中application也是单例
3、spingMVC中的控制器对象也是单例
4、spring中每个bean默认也是单例,便于spring容器的管理
5、数据库的连接池设计也采用单例模式
6、读取配置文件的类一般也采用单例模式
7、windows中的任务管理器和回收站包括文件系统的设计也都是单例模式
8、网站的计数器也是单例模式,否则无法实现同步
9、应用程序中的日志应用一般也采用单例模式,因为一般日志信息大多一直处于共享状态
3、单例模式的优点
1、由于单例模式每次只产生一个实例,所以对系统性能开销较小,对于创建一些占用系统资源较高的对象可以采用单例模式的设计,例如读取配置文件,产生其他依赖对象等可以在应用启动时直接产生一个单例对象,然后永久驻留在内存中
2、单例模式可以在系统设立全局的访问点,优化共享资源的范问,例如对于数据库的映射就可以用过一个单例对象来实现
4、常见的五种单例模式实现方式
1、饿汉式(线程安全,调用效率高,但是不能延迟加载)
2、懒汉式(线程安全,调用效率低,可以延迟加载)
3、双重检测模式(线程安全。调用效率较高)
4、静态内部类式(线程安全,调用效率高,可以延迟加载)
5、枚举单例(线程安全,调用效率高,不能延迟加载)
5、常见的五种单例模式具体实现
5.1饿汉式
1、构造器私有化
private Singleton(){
}
2、静态输出化属性对象
private static Singleton instance = new Singleton();
3、提供供外部访问的方法
public Singleton getInstance(){
return instance;
}
注意:
在执行以下这行代码的时候,由于静态属性在类加载的时候初始化,它是天然线程安全的,所以在getInstance()方法前不需要加上synchronized
private static Singleton instance = new Singleton();
饿汉式缺点
没有延迟加载,也就是说我们如果不调用getInstance()方法,就不会用到new出来的对象,会造成内存资源的浪费
5.2懒汉式
优点:
具有延迟加载,资源利用率高
缺点:
方法同步,效率较低
5.3双重检测模式
优点:
在懒汉式的基础上进行了效率的优化,多加了一层判断instance是否为空,缓解了线程安全带来的效率问题
5.4静态内部类实现方式
优点:线程安全,又实现了懒加载,提高了资源的利用率,且优化了线程安全引起的效率低问题、
缺点:有反射和反序列化的漏洞存在
5.5枚举方式
优点:枚举是天然的单例,由JVM从根本上进行保障,可以避免反射和反序列化的漏洞
缺点:没有延迟加载
6、如何选用
6.1 占用系统资源大,要求延迟加载
静态内部类>双重检测模式>懒汉式
6.2 占用系统资源小,不要求延迟加载
枚举要好于饿汉式