单例模式的应用场景有哪些 (单例模式的应用场景)
本文目录导航:
单例模式的应用场景有哪些
应用的单例模式(Singleton)的场合很多。
比如,开发了一个串口通信类通常采用单例模式。
因为在程序中,同一个串口不允许重复打开,采用单例模式可以从代码结构上避免这个问题。

最常用的设计模式-单例
单例模式,一种创建型设计模式,确保类在整个应用中只有一个实例,提供全局访问点,避免重复实例化,简化代码。
其关键在于确保全局唯一性,提供单一入口。
使用单例模式主要为限制实例化次数,简化访问方式,适用于全局管理类或需要共享资源的场景。
然而,使用不当可能引发全局状态和耦合问题,影响代码结构和可维护性。
选择单例模式时需权衡。
其优点包括简化访问和全局管理,降低代码复杂度。
缺点则涉及全局状态风险、耦合问题和单点故障,可能限制代码灵活性。
Java中双重检查锁定实现单例模式示例展示了如何安全高效地创建唯一实例,通过私有构造函数和volatile关键字确保线程安全,使用双重检查锁定机制提高性能。
实例化操作仅在实例未创建时执行,避免不必要的同步开销。
在实际应用中,通过调用()方法即可获取唯一实例,适用于需要全局访问且实例化成本较高的场景。
在选择设计模式时,应综合考虑应用需求、性能、可维护性等因素,权衡利弊,合理运用。
单例模式介绍和使用场景及Spring单例模式的使用
1.什么是单例模式
单例模式(SingletonPattern)是Java中最简单的设计模式之一。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
提供了对唯一实例的受控访问
由于系统中内存只存在一个对象,因此可以节约系统的的资源,对于一些频繁的创建和销毁的对象单例模式无意可以提供系统的性能
单例模式可以允许可变的数目的实例,使用单利模式进行扩展,使用控制单利对象相似的方法获取指定个数的实例,及解决了单利对象,共享过多,而有损性能的问题
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接口时,即使将其构造函数设为私有,在它反序列化时依然会通过特殊的途径再创建类的一个新的实例,相当于调用了该类的构造函数有效地获得了一个新实例!
在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