欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

23种设计模式之单例模式

程序员文章站 2022-06-21 10:20:30
单例模式的定义 定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的通用类图如下: 单例模式的优缺点 单例模式的优点: 单例模式的缺点: 单例模式的注意事项 1.高并发情况下,注意线程同步问题 这是一个线程不安全的单例 该单例模式在低并发的情况下可能不会出现问题,若 ......

单例模式的定义

定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.

单例模式的通用类图如下:

23种设计模式之单例模式

 

单例模式的优缺点

单例模式的优点:

  1. 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而且创建和销毁时性能又无法优化,单例模式的优势就非常明显
  2. 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决(在java ee中采用单例模式时需要注意jvm垃圾回收机制)
  3. 单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作
  4. 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射关系

单例模式的缺点:

  1. 单例模式一般没有接口,扩展很困难,若要扩展,出来修改代码基本上没有第二种途径可以实现.
  2. 单例模式对测试是不利的.在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象
  3. 单例模式与单一职责原则有冲突. 一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把"要单例"和业务逻辑融合在一个类中.

单例模式的注意事项

1.高并发情况下,注意线程同步问题

这是一个线程不安全的单例

23种设计模式之单例模式

 

该单例模式在低并发的情况下可能不会出现问题,若并发量增加就可能在内存中出现多个实例,破坏了最初的预期.

解决线程不安全的方法有很多,可以在 getinstance 方法前加 synchronized 关键字,也可以在方法内增加 synchronized实现,这种被称为懒汉式单例,还有一种饿汉式单例,代码如下:

23种设计模式之单例模式

 

2.对象被复制的情况

在java中,对象默认是不可以被复制的,若实现了cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象复制是不用调用类的构造函数的,因此即使是私有的构造函数,对象仍然可以被复制. 一般情况下,类复制的情况是不用考虑的,很少会出现一个单例类会主动要求被复制的情况,解决该问题的最好方法就是单例类不要实现cloneable接口


单例模式是23个模式中比较简单的模式,应用也很广泛,如在spring中,每个bean默认就是单例的,这样做的优点是spring容器可以管理这些bean的生命期,决定什么时候创建出来,什么时候销毁,销毁的时候要如何处理,等等.


 

 

可以关注一下鄙人的公众号, 谢谢各位了!23种设计模式之单例模式