单例模式介绍和使用场景及Spring单例模式的使用

如题所述

第1个回答  2024-09-19
1.什么是单例模式

单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2.单例模式的优点/缺点和使用场景2.1单例模式的优点

提供了对唯一实例的受控访问

由于系统中内存只存在一个对象,因此可以节约系统的的资源,对于一些频繁的创建和销毁的对象单例模式无意可以提供系统的性能

单例模式可以允许可变的数目的实例,使用单利模式进行扩展,使用控制单利对象相似的方法获取指定个数的实例,及解决了单利对象,共享过多,而有损性能的问题

2.2单例模式的缺点

由于单例模式,不是抽象的所以可扩展性比较差

职责过重,在一定程度上违背了单一职责

滥用单例将带来一些负面的问题,如为了节省资源将数据库连接池对象设计为单例模式,可能会导致共享连接池对象的程序过多未出而出现的连接池溢出,如果实例化对象长时间不用系统就会被认为垃圾对象被回收,这将导致对象状态丢失

2.3单例模式的使用场景

开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象。

3.单例模式的12种写法3.1饿汉式(静态变量)publicclassSingleton{privatestaticSingletoninstance=newSingletion();privateSingletion(){}publicstaticSingletongetInstance(){returninstance;}}3.2饿汉式(静态常量)publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}3.3饿汉式(静态代码块)publicclassSingleton{privatestaticSingletoninstance;static{instance=newSingleton();}privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}

上面三种写法本质上其实是一样的,也是各类文章在介绍饿汉式时常用的方式。但使用静态final的实例对象或者使用静态代码块依旧不能解决在反序列化、反射、克隆时重新生成实例对象的问题。序列化:一是可以将一个单例的实例对象写到磁盘,实现数据的持久化;二是实现对象数据的远程传输。当单例对象有必要实现Serializable接口时,即使将其构造函数设为私有,在它反序列化时依然会通过特殊的途径再创建类的一个新的实例,相当于调用了该类的构造函数有效地获得了一个新实例!

3.4懒汉式(线程不安全)publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}3.5懒汉式(线程安全,存在同步开销)classSingleton{privatestaticSingletonintance=null;privateSingleton(){//私有构造函数}publicstaticsynchronizedSingletongetInstance(){if(intance==null){intance=newSingleton();}returnintance;}}3.6懒汉式(线程假装安全,同步代码块)classSingleton{privatestaticSingletonsingleton;privateSingleton(){}publicstaticSingletongetInstance(){if(singleton==null){//4.加入同步代码块synchronized(Singleton.class){singleton=newSingleton();}}returnsingleton;}}3.7DCL「双重检测锁:DoubleCheckedLock」(假)publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}}3.8DCL「双重检测锁:DoubleCheckedLock」单例(真)publicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){instance=newSingleton();}}returninstance;}}3.9静态内部类(推荐使用)publicclassSingleton{privateSingleton(){}privatestaticclassSingletonInstance(){privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnSingletonInstance.INSTANCE;}}3.10枚举类单例模式publicenumSingleton{INSTANCE;privateResourceinstance;Singleton(){instance=newResource();}publicResourcegetInstance(){returninstance;}publicstaticclassResource{privateResource(){}}}3.11登记式单例--使用Map容器来管理单例模式publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}03.12内部枚举类publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}14.Spring依赖注入对单例的使用

在AbstractBeanFactory中

publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}24.1doGetBean中getSingletonpublicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}34.2getSingleton的实现

返回在给定名称下注册的(原始)单例对象,检查已经实例化的单例并允许提前对当前创建的单例的引用(解析循环引用)。

publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}4

作者:ZhangSan_Plus

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场

单例模式介绍和使用场景及Spring单例模式的使用
单例模式可以允许可变的数目的实例,使用单利模式进行扩展,使用控制单利对象相似的方法获取指定个数的实例,及解决了单利对象,共享过多,而有损性能的问题 2.2单例模式的缺点由于单例模式,不是抽象的所以可扩展性比较差 职责过重,在一定程度上违背了单一职责 滥用单例将带来一些负面的问题,如为了节...

spring主要运用那些设计模式,单例模式是怎么实现的?
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的...

spring单例和非单例
单例适用场景:需要频繁实例化然后销毁的对象。创建对象时耗时过多或者耗资源过多,但又经常用到的对象。有状态的工具类对象。频繁访问数据库或文件的对象。其他要求只有一个对象的场景 单例的缺点 就是不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,...

开发应用场景及顺序
设计模式应用场景是什么?JavaEE应用中Spring用于创建IOC容器的监听器就是基于观察者模式的。Spring中获取FileSystemResource和ClassPathResource等功能雷同的类时使用模板方法。单例模式包含懒汉饿汉式以及不同的变种,工厂类设计模式一般也设计为单例。项目中的一些配置或引入外部的sdk需要创建管理类,或封装自己...

springboot如何保证一个类不消亡
单例模式,依赖注入。1、单例模式:将类设计为单例模式,确保在整个应用程序中有一个实例存在,可以保证类不会消亡,只有一个对象存在。2、依赖注入:使用SpringBoot的依赖注入功能,需要保持存活的类注入到其他依赖它的组件中,这些组件存在,类就不会消亡。

Spring 框架中都用到了哪些设计模式?
Spring框架中使用了多种设计模式,其中常用的有:1. 工厂模式(Factory Pattern):用于创建对象,将对象的创建和使用分离。2. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局访问点。3. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。4. 模板方法...

spring中bean的作用域有哪些
1、Singleton(单例模式):在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。每次获取该Bean时,都将返回同一个实例。这是默认的作用域。2、Prototype(原型模式):每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。每次获取该Bean时,都会返回一个新的实例...

SpringMVC默认单例的,高并发情况下,如何保
实质上这种理解是错误的,Java里有个API叫做ThreadLocal,spring单例模式下用它来切换不同线程之间的参数。用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下,spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不...

Spring篇-Spring中使用了哪些设计模式
策略模式(Strategy Pattern)允许算法在运行时更改,这为不同场景下的灵活策略提供了支持。Spring中使用策略模式的实例之一是通过不同的实例化策略接口来实现对象的创建逻辑,如SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy,提供了一种动态选择创建策略的机制。适配器模式(Adapter Pattern)...

如何写一个简单的单例模式?
单例的实现主要是通过以下两个步骤:1、将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的...

相似回答
大家正在搜