singleton是怎样的模式 (single version)
本文目录导航:
singleton是怎样的模式?
Singleton(单例)模式是一种常用的软件设计模式,它属于创建型模式,主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
Singleton模式在多线程环境中尤其有用,因为它可以保证在系统中无论何时何地,都只有一个实例存在,从而避免了资源的重复创建和不必要的消耗。
**Singleton模式的实现要点包括:**1. **私有构造函数**:为了防止其他类实例化Singleton类,其构造函数被声明为私有。
2. **静态实例变量**:Singleton类包含一个静态变量,用于存储唯一实例。
这个静态变量在Singleton类的内部初始化。
3. **公共的静态方法**:Singleton类提供一个公共的静态方法,通常命名为`getInstance()`,用于返回Singleton实例。
如果实例尚未创建,`getInstance()`方法将创建一个新实例;如果实例已经存在,它将直接返回该实例。
4. **线程安全**:在多线程环境中,需要确保`getInstance()`方法是线程安全的,即在并发访问下,Singleton模式仍然能确保只创建一个实例。
这通常通过同步机制(如synchronized关键字)实现,但需要注意的是,过度使用同步可能会降低性能,因此有时候会使用双重检查锁定(Double-Checked Locking)等技术来优化。
**Singleton模式的优点:**- 确保系统中一个类只有一个实例,节省内存资源。
- 全局访问点,简化了对实例的访问。
- 对于频繁使用的对象,可以省去创建新实例的时间,提高性能。
**Singleton模式的缺点:**- 单例模式会隐藏类的实例化,这可能会给测试带来困难,因为单例对象很难被模拟或替换。
- 过度使用单例模式可能会导致代码结构的不清晰,降低代码的可维护性和可扩展性。
- 单例模式的静态特性与Java的序列化机制不兼容,如果不妥善处理,序列化可能会导致单例模式失效。
在使用Singleton模式时,应根据具体的应用场景和需求来权衡其优缺点,避免滥用。
同时,现代软件设计中也出现了很多替代或改进单例模式的技术,如依赖注入(DI)框架等,它们提供了更灵活、更可测试的解决方案。

单例模式介绍和使用场景及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
单例模式你会几种写法?
本文将深入探讨单例模式的多种实现方法,包括饿汉式、简单懒汉式、双重检测机制懒汉式、静态内部类懒汉式和枚举方式。
这些模式在不同场景下各有优缺点,掌握它们有助于优化内存管理和性能提升。
首先,单例模式的核心在于保证一个类只有一个实例。
在Java Web开发中,当需要频繁创建和管理对象时,如Struts2框架,使用单例模式可以避免内存浪费,降低资源消耗。
然而,直接在方法上加锁的简单懒汉式在多线程环境中存在风险,这时需要采用双重检测机制,即在同步代码块中检查对象是否存在,配合volatile关键字解决重排序问题。
除了上述方法,静态内部类懒汉式以巧妙的方式实现,不仅优化了代码结构,而且高效。
枚举方式实现单例简单直观,枚举类型的实例是线程安全的,无需额外同步措施。
总结起来,本文总共介绍了五种单例模式的写法:饿汉式、简单懒汉式、双重检测懒汉式、静态内部类懒汉式以及枚举方式。
持续关注,未来将有更多设计模式的内容分享。
对于Java技术的学习交流,欢迎关注微信公众号Java3y,或加入QQ群,一起探索技术的无限可能。
感谢你的阅读和支持,也期待你的宝贵意见和分享给更多需要的朋友。