23种设计模式之------单例模式(不同应用场景下的实现方案)

前言

在Java的23种设计模式中,单例模式是最为简单,也是使用频率很高的一种设计模式,使用spring的同学都应该知道,spring类的默认加载方式就是单例的。所谓单例,也就是说这个类的实例对象只能有一个,如何达到这一点呢?那么本文主要学习单例模式的几种设计方式。

设计要素

  • 单例类只能有一个实例。
  • 单例类的构造方法必须是私有的,目的在于外部不能去创建。
  • 外部如果要去访问这个类的实例对象,那么这个单例类必须内部提供一个方法供外部去访问。
  • 单例类也可以设计为final的,这样这个单例类也不允许被子类继承。

设计方案

根据业务需求不同,可以设计不同的方案,一般来说,根据实例创建的时机和是否支持多线程等分为不同的设计方式

按加载时机分:

  • 懒汉模式:加载类的时候不创建实例,在使用的时候再创建实例
  • 饿汉模式:在类加载的时候创建实例,使用的时候直接取即可

按是否支持多线程分:

  • 多线程模式:可以多线程下调用,获取的是同一个实例对象
  • 不支持多线程:多线程下会出现多个实例对象

实现方式

1、单例模式----饿汉模式

加载类的时候创建对象,实现方式如下:

23种设计模式之------单例模式(不同应用场景下的实现方案)

优点:实现简单,不不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法即可,

缺点:class类在被加载的时候创建 Singleton01实例,如果对象创建后一直没有使用,则会浪费很大内存空空间,此方式不适合创建大对象

2、单例模式----懒汉模式(线程不安全)

加载类的时候创建对象,实现方式如下:

23种设计模式之------单例模式(不同应用场景下的实现方案)

优点:节省内存空间,之后在使用的时候才会创建

缺点:在多线程下,可能会创建多个实例

3、单例模式----懒汉模式(线程安全)

加载类的时候创建对象,实现方式如下:

23种设计模式之------单例模式(不同应用场景下的实现方案)

优点:支持多线程,且以懒汉模式的方式加载,不浪费内存空间

缺点:将synchronized加在方法上,会影响并发量,每次调用getInstance方法都会线程同步,效率十分低下,而且当创建好实例对象之后,也就不必继续进行同步了

4、单例模式----懒汉模式(线程安全)

加载类的时候创建对象,实现方式如下:

23种设计模式之------单例模式(不同应用场景下的实现方案)

优点:支持多线程,并发量高,且以懒汉模式的方式加载,不浪费内存空间

缺点:该方式没有缺点,如果一定说缺点的话,就是实现方式比较麻烦

总结

单例模式不是最难的模式,但是确是使用最为广泛的,使用过程中也会遇到一些问题,所以使用之前一定要分析项目的需求,是否需要指出高并发,实例对象是否经常使用,根据不同场景使用不同方案

转载请声明,如有问题,请在评论区留言,谢谢!


分享到:


相關文章: