前言
在Java的23种设计模式中,单例模式是最为简单,也是使用频率很高的一种设计模式,使用spring的同学都应该知道,spring类的默认加载方式就是单例的。所谓单例,也就是说这个类的实例对象只能有一个,如何达到这一点呢?那么本文主要学习单例模式的几种设计方式。
设计要素
- 单例类只能有一个实例。
- 单例类的构造方法必须是私有的,目的在于外部不能去创建。
- 外部如果要去访问这个类的实例对象,那么这个单例类必须内部提供一个方法供外部去访问。
- 单例类也可以设计为final的,这样这个单例类也不允许被子类继承。
设计方案
根据业务需求不同,可以设计不同的方案,一般来说,根据实例创建的时机和是否支持多线程等分为不同的设计方式
按加载时机分:
- 懒汉模式:加载类的时候不创建实例,在使用的时候再创建实例
- 饿汉模式:在类加载的时候创建实例,使用的时候直接取即可
按是否支持多线程分:
- 多线程模式:可以多线程下调用,获取的是同一个实例对象
- 不支持多线程:多线程下会出现多个实例对象
实现方式
1、单例模式----饿汉模式
加载类的时候创建对象,实现方式如下:
优点:实现简单,不不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法即可,
缺点:class类在被加载的时候创建 Singleton01实例,如果对象创建后一直没有使用,则会浪费很大内存空空间,此方式不适合创建大对象
2、单例模式----懒汉模式(线程不安全)
加载类的时候创建对象,实现方式如下:
优点:节省内存空间,之后在使用的时候才会创建
缺点:在多线程下,可能会创建多个实例
3、单例模式----懒汉模式(线程安全)
加载类的时候创建对象,实现方式如下:
优点:支持多线程,且以懒汉模式的方式加载,不浪费内存空间
缺点:将synchronized加在方法上,会影响并发量,每次调用getInstance方法都会线程同步,效率十分低下,而且当创建好实例对象之后,也就不必继续进行同步了
4、单例模式----懒汉模式(线程安全)
加载类的时候创建对象,实现方式如下:
优点:支持多线程,并发量高,且以懒汉模式的方式加载,不浪费内存空间
缺点:该方式没有缺点,如果一定说缺点的话,就是实现方式比较麻烦
总结
单例模式不是最难的模式,但是确是使用最为广泛的,使用过程中也会遇到一些问题,所以使用之前一定要分析项目的需求,是否需要指出高并发,实例对象是否经常使用,根据不同场景使用不同方案
转载请声明,如有问题,请在评论区留言,谢谢!