单例模式介绍和使用场景及Spring单例模式的使用 (单例模式详解)

本文目录导航:

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

1.什么是单例模式

单例模式(SingletonPattern)是Java中最简单的设计模式之一。

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

单例模式介绍和使用场景及Spring单例模式的使用 (单例模式详解)

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

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

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=newSingleton();}}returnsingleton;}}3.7DCL「双重检测锁:DoubleCheckedLock」(假)publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(){if(instance==null){instance=newSingleton();}}}returninstance;}}3.8DCL「双重检测锁:DoubleCheckedLock」单例(真)publicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(){instance=newSingleton();}}returninstance;}}3.9静态内部类(推荐使用)publicclassSingleton{privateSingleton(){}privatestaticclassSingletonInstance(){privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){;}}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;}}依赖注入对单例的使用

在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

单例模式都用在什么地方?能举几个例子吗

单例模式在编程中起到控制类实例数量的作用,确保某个类只有一个实例存在。

广泛应用于各种场景,比如线程池、缓存、日志、对话框、打印机和显卡驱动等资源管理器。

通过单例模式,可以实现资源的有效管理和合理利用。

例如,打印机在计算机上可能有多个,但Printer Spooler作为资源管理器只能有一个,防止两个打印作业同时输出到同一打印机。

此外,通信端口在系统中也需集中管理,避免同一端口被两个请求同时调用,以提高系统效率和稳定性。

单例模式的应用场景有哪些

应用的单例模式(Singleton)的场合很多。

比如,开发了一个串口通信类通常采用单例模式。

因为在程序中,同一个串口不允许重复打开,采用单例模式可以从代码结构上避免这个问题。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

46阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

38阅读

php一句话木马,一句话木马ctf

2026年10月05日

40阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

43阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

41阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

38阅读