23种设计模式【创建型模式】详细介绍之【单例模式】
23种设计模式【创建型模式】详细介绍之【单例模式】
- 设计模式的分类和应用场景总结
- 单例模式
- 1. 概述
- 2. 实现方式
- 2.1 饿汉式单例模式
- 2.2 懒汉式单例模式(非线程安全)
- 2.3 懒汉式单例模式(线程安全)
- 3. 单例模式的优缺点
- 3.1 优点
- 3.2 缺点
- 4. 使用场景
- 5. 注意事项
- 6. 总结
设计模式的分类和应用场景总结
可以查看专栏设计模式:设计模式
单例模式
在软件设计模式中,单例模式是一种常见且重要的创建型模式。它确保一个类只有一个实例,并提供一个全局访问点。
1. 概述
单例模式属于创建型设计模式,用于限制类的实例化次数为一个。它通常在需要管理全局状态或控制共享资源访问时发挥作用,例如配置信息、日志记录器、数据库连接池等。单例模式能够有效地节省系统资源,提高性能,并且易于扩展和维护。
2. 实现方式
单例模式的实现方式通常包括以下几种:
2.1 饿汉式单例模式
在类加载时即创建实例,保证线程安全,但可能会导致资源浪费。
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
2.2 懒汉式单例模式(非线程安全)
延迟实例化,在第一次使用时创建实例,简单但非线程安全。
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
2.3 懒汉式单例模式(线程安全)
使用双重检查锁定(Double-Checked Locking),确保在多线程环境下仍然能够正确工作。
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
3. 单例模式的优缺点
3.1 优点
- 全局唯一实例: 确保一个类只有一个实例存在,避免了不必要的内存占用。
- 延迟初始化: 在需要时才进行实例化,节省系统资源。
- 线程安全(部分实现): 可以通过同步机制确保在多线程环境下的安全访问。
3.2 缺点
- 可能引起资源浪费: 饿汉式单例在类加载时即创建实例,可能导致不必要的资源占用。
- 复杂度增加: 实现线程安全的懒汉式单例需要考虑双重检查锁定等机制,增加了复杂性。
4. 使用场景
单例模式适合以下场景:
- 资源共享情况: 需要共享访问的资源,如线程池、缓存、对话框等。
- 控制资源的使用: 资源池管理、日志对象等。
5. 注意事项
在使用单例模式时,需要注意以下几点:
- 线程安全性: 根据具体需求选择合适的实现方式,确保在多线程环境下的安全访问。
- 反射攻击: 可以通过私有构造方法抛出异常或在创建第二个实例时抛出异常来防止反射攻击。
- 序列化与反序列化: 如果单例类可能会被序列化和反序列化,需要实现
readResolve()
方法来避免创建新的实例。
6. 总结
单例模式是一种简单而强大的设计模式,能够有效地管理全局状态和资源,提高系统的性能和可维护性。在实际应用中,根据具体需求选择合适的实现方式,并注意线程安全和资源管理问题。
版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/
看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]
加油!
共同努力!
Keafmd
感谢支持牛哄哄的柯南,期待你的三连+关注~~
keep accumulate for my dream【共勉】
↓ ↓ ↓ ↓ ↓ ↓