"本文介绍了Java中的单例模式,包括其概念、要点、以及三种常见的实现方式:饿汉式、懒汉式和注册式。" 在软件设计模式中,单例模式是一种常用的模式,它保证了一个类在整个应用中只有一个实例存在。这种模式在需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的场景下非常有用,因为它可以避免对系统资源的浪费,提高系统效率。 1. **单例模式的概念**: 单例模式的核心思想是限制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这样可以控制实例的数量,避免多个实例间的不必要通信,简化系统设计。 2. **单例模式的要点**: - **唯一性**:一个类只有一个实例。 - **自我实例化**:类负责自己的实例化,通常通过私有构造函数实现。 - **全局访问**:提供一个公共静态方法供外部获取该唯一的实例。 3. **单例模式的实现**: - **饿汉式(Eager Singleton)**:在类加载时就创建实例,确保实例在任何情况下都已准备就绪。这种方式简单且线程安全,但可能会造成不必要的内存占用。 - ```java public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return m_instance; } } ``` - **懒汉式(Lazy Singleton)**:延迟到首次调用 `getInstance()` 方法时才创建实例,这样可以节省资源。但在多线程环境下,如果不做同步处理,可能会产生多个实例。下面的代码添加了同步锁,保证了线程安全,但可能会影响性能。 - ```java public class LazySingleton { private static LazySingleton m_instance = null; private LazySingleton() {} synchronized public static LazySingleton getInstance() { if (m_instance == null) { m_instance = new LazySingleton(); } return m_instance; } } ``` - **登记式(Registry Singleton)**:利用类装载机制保证初始化实例时只有一个线程,同时避免了线程同步问题。这种方法灵活性更高,但实现稍微复杂。 - ```java import java.util.HashMap; public class RegSingleton { static private HashMap m_registry = new HashMap(); static { RegSingleton sl = new RegSingleton(); m_registry.put(sl.getClass().getName(), sl); } protected RegSingleton() {} public static RegSingleton getInstance(String name) { // 实际获取逻辑... } } ``` 4. **注意事项**: - **线程安全性**:在多线程环境下,确保单例模式的正确实现至关重要。饿汉式天生线程安全,而懒汉式和登记式需要额外考虑线程同步问题。 - **序列化**:默认情况下,序列化和反序列化会破坏单例,需要在单例类上实现 `readResolve()` 方法来修复。 - **测试与反射**:单元测试时,可能需要创建多个实例进行测试,这可以通过反射来规避单例限制。因此,设计时应考虑测试的可操作性。 5. **适用场景**: - 控制系统中的日志对象、缓存对象、线程池、数据库连接池等。 - 当一个类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 - 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 单例模式是一种实用的设计模式,可以有效地管理类的实例数量,提高程序的运行效率。但在使用时需谨慎,避免过度使用导致设计过于复杂。
![](https://csdnimg.cn/release/download_crawler_static/88367115/bg1.jpg)
下载后可阅读完整内容,剩余4页未读,立即下载
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/7386ab88f5ce450e8817b9541ae085eb_caryxp.jpg!1)
- 粉丝: 1931
- 资源: 4044
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决Eclipse配置与导入Java工程常见问题
- 真空发生器:工作原理与抽吸性能分析
- 爱立信RBS6201开站流程详解
- 电脑开机声音解析:故障诊断指南
- JAVA实现贪吃蛇游戏
- 模糊神经网络实现与自学习能力探索
- PID型模糊神经网络控制器设计与学习算法
- 模糊神经网络在自适应PID控制器中的应用
- C++实现的学生成绩管理系统设计
- 802.1D STP 实现与优化:二层交换机中的生成树协议
- 解决Windows无法完成SD卡格式化的九种方法
- 软件测试方法:Beta与Alpha测试详解
- 软件测试周期详解:从需求分析到维护测试
- CMMI模型详解:软件企业能力提升的关键
- 移动Web开发框架选择:jQueryMobile、jQTouch、SenchaTouch对比
- Java程序设计试题与复习指南
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)