单例设计模式:孤独的“唯一”守护者

单例设计模式:孤独的“唯一”守护者
Mozi在一个神秘的王国里,有一座传说中的城堡,城堡里住着一位孤独的国王。他是这个王国的唯一统治者,所有的决策都由他一人做出。为了确保王国的稳定,国王制定了一条铁律:整个王国只能有一个国王,绝不允许出现第二个!
一、问题:为什么需要“唯一的国王”?
在王国的早期,曾经发生过一场混乱:
- 每个城镇都试图选出自己的国王(多个实例),结果导致了资源浪费(重复创建对象)。
- 有些城镇甚至同时选出了两个国王(线程不安全),导致了权力冲突。
- 更糟糕的是,有些叛徒试图通过反射和反序列化的方式,偷偷创建新的国王,试图篡权。
为了避免这些问题,王国的智者提出了一个解决方案:单例设计模式。
二、解决方案:国王的“唯一性”法则
为了确保王国只有一个国王,智者们设计了一套严格的规则:
私有化构造函数:
防止任何人通过new
的方式创建新的国王。静态实例:
在城堡的密室中存放一个静态的国王实例,所有人只能通过密室的入口获取国王。全局访问点:
提供一个公共方法(如getInstance()
),让所有人都能找到唯一的国王。
三、实现方式:国王的诞生之路
1. 饿汉式:国王一出生就登基
在王国建立之初,国王就已经被选定,无论是否需要,他都会一直在位。
实现代码:
1 | public class Singleton { |
- 优点:简单直接,线程安全。
- 缺点:即使国王暂时没用到,也会一直占用资源。
2. 懒汉式:国王按需登基
国王只有在需要时才会登基,平时他会在幕后休息。
实现代码:
1 | public class Singleton { |
- 优点:节省资源,按需创建。
- 缺点:多线程环境下可能会出现多个国王(线程不安全)。
3. 静态内部类:国王的密室
国王被藏在密室中,只有在需要时才会被召唤,而密室的门锁保证了线程安全。
实现代码:
1 | public class Singleton { |
- 优点:线程安全,延迟加载,性能高。
- 缺点:无明显缺点,堪称完美。
4. 枚举:国王的神圣加冕
国王的地位由枚举定义,天然防止反射和反序列化的篡权行为。
实现代码:
1 | public enum Singleton { |
- 优点:实现简单,线程安全,防止反序列化破坏单例。
- 缺点:不支持懒加载。
四、优缺点对比:
实现方式 | 优点 | 缺点 |
---|---|---|
饿汉式 | 简单,线程安全 | 占用内存,即使未使用实例也会初始化 |
懒汉式 | 延迟加载,节省资源 | 线程不安全,需额外同步处理 |
静态内部类 | 延迟加载,线程安全,性能高 | 无明显缺点 |
枚举 | 简单,线程安全,防止反序列化破坏单例 | 不支持懒加载 |
五、适用场景:国王的职责
单例模式适用于以下场景:
- 配置管理:国王负责管理整个王国的配置。
- 日志记录:国王记录王国的所有大事小情。
- 线程池:国王管理王国的劳动力分配。
- 数据库连接池:国王负责分配数据库资源。
- 缓存:国王管理王国的共享数据。
六、注意事项:国王的安全守则
多线程环境:
确保线程安全,推荐使用静态内部类或枚举实现。反序列化问题:
枚举实现天然防止反序列化破坏单例。反射攻击:
私有化构造函数,防止通过反射创建新的实例。
七、故事结尾
在这片神秘的王国里,国王的“唯一性”法则彻底解决了混乱问题:
- 所有城镇都共享同一个国王,资源分配井然有序。
- 国王的密室(静态内部类)保证了线程安全,任何人都无法篡权。
- 即使有人试图通过反射或反序列化破坏规则,枚举国王也能轻松化解危机。
国王站在城堡的高塔上,俯瞰着整个王国,感慨道:“单例模式,真香!”
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果