深入解析Singleton:22种开发模式之单例篇
"这篇资料详细介绍了22种常见的开发模式,其中包括了Singleton单类模式的两种实现方式:饱汉模式和饿汉模式。" 在软件工程中,开发模式(也称为设计模式)是一套被反复使用的、针对特定场景的、经过时间验证的解决方案,它描述了在特定上下文中如何解决常见问题。这些模式提供了可复用的结构和行为,有助于提高代码的可读性和可维护性。其中,Singleton模式是最基础且广泛应用的一种模式。 Singleton模式的核心目标是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场景下非常有用,例如配置中心、日志记录、数据库连接池等,它使得在整个应用中,对某个对象的控制变得集中且易于管理。 1. 饱汉模式(Eager Initialization): 在饱汉模式中,Singleton实例在类加载时就已经创建。这种方式简单且线程安全,因为实例是在类加载时创建的,所以不存在多线程环境下并发创建多个实例的问题。但缺点是如果 Singleton 类不被使用,也会提前占用系统资源。 ```java public class Singleton1 { public static final Singleton1 instance = new Singleton1(); private Singleton1() {} public static Singleton1 getInstance() { return instance; } } ``` 2. 饿汉模式(Lazy Initialization): 饿汉模式是在首次调用 `getInstance` 方法时才创建 Singleton 实例。这种方式在多线程环境下需要使用 `synchronized` 关键字保证线程安全,防止并发创建多个实例。饿汉模式相比饱汉模式,延迟了实例的创建,节省了资源,但同步开销会增加。 ```java public class Singleton2 { public static Singleton2 instance; private Singleton2() {} public static synchronized Singleton2 getInstance() { if (instance == null) { instance = new Singleton2(); } return instance; } } ``` 然而,Singleton 模式的这两种实现方式都存在一些潜在问题: 1. 反射攻击:尽管构造函数是私有的,但通过反射API可以创建新的实例,破坏了 Singleton 的唯一性。 2. 序列化攻击:如果 Singleton 实现了序列化接口,那么通过反序列化也可以创建新的实例。 为了防御这些问题,可以采用以下策略: - 添加 `readResolve()` 方法:对于序列化,我们可以在 Singleton 类中添加 `readResolve()` 方法,返回已存在的 Singleton 实例,防止反序列化时创建新实例。 ```java private Object readResolve() { return getInstance(); } ``` - 使用 `Enum`:Java 中的枚举天然具有线程安全和防止反射攻击的特性,因此可以考虑将 Singleton 类定义为枚举类型。 ```java public enum Singleton { INSTANCE; } ``` 以上是 Singleton 模式的基本介绍,实际开发中还需要结合具体场景选择适合的实现方式,并注意防止可能的漏洞。Singleton 模式只是22种开发模式之一,还有其他模式如 Factory、Builder、Prototype、Observer、Adapter、Decorator 等,每一种都有其独特的应用场景和价值。学习和掌握这些模式,能够帮助开发者更好地设计和构建高效、可扩展的软件系统。
![](https://csdnimg.cn/release/download_crawler_static/8400203/bgb.jpg)
![](https://csdnimg.cn/release/download_crawler_static/8400203/bgc.jpg)
![](https://csdnimg.cn/release/download_crawler_static/8400203/bgd.jpg)
剩余63页未读,继续阅读
![apk](https://img-home.csdnimg.cn/images/20210720083646.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://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://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/8881fc0f4e7a464db722417633b8f0d2_linjiebelfast.jpg!1)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/user-vip.1c89f3c5.png)
- 粉丝: 131
- 资源: 26
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- AirKiss技术详解:无线传递信息与智能家居连接
- Hibernate主键生成策略详解
- 操作系统实验:位示图法管理磁盘空闲空间
- JSON详解:数据交换的主流格式
- Win7安装Ubuntu双系统详细指南
- FPGA内部结构与工作原理探索
- 信用评分模型解析:WOE、IV与ROC
- 使用LVS+Keepalived构建高可用负载均衡集群
- 微信小程序驱动餐饮与服装业创新转型:便捷管理与低成本优势
- 机器学习入门指南:从基础到进阶
- 解决Win7 IIS配置错误500.22与0x80070032
- SQL-DFS:优化HDFS小文件存储的解决方案
- Hadoop、Hbase、Spark环境部署与主机配置详解
- Kisso:加密会话Cookie实现的单点登录SSO
- OpenCV读取与拼接多幅图像教程
- QT实战:轻松生成与解析JSON数据
![](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)