提示信息

设计模式概述:单例模式

力挽狂澜 已关注

单例模式(Singleton Pattern)是一种创建型设计模式,其目的在于确保一个类只有一个实例,并提供一个全局访问点。单例模式适用于需要控制实例数目的场景,例如:

  • 资源管理:数据库连接池、线程池等
  • 配置管理:全局配置、应用设置
  • 日志记录器:共享一个日志文件或输出流

下面是单例模式的几个关键要素和常见实现方式:

关键要素

  1. 私有构造函数:防止类在外部被实例化。
  2. 私有静态变量:用于存储类的唯一实例。
  3. 公共静态方法:用于提供对实例的全局访问点。

单例模式的常见实现方式

1. 饿汉式(Eager Initialization)

在类加载时就创建实例,简单但可能会造成资源浪费。

  1. public class Singleton {
  2. private static final Singleton INSTANCE = new Singleton();
  3. private Singleton() {}
  4. public static Singleton getInstance() {
  5. return INSTANCE;
  6. }
  7. }

2. 懒汉式(Lazy Initialization)

在第一次请求实例的时候才创建,能够节省资源。

  1. public class Singleton {
  2. private static Singleton instance;
  3. private Singleton() {}
  4. public static Singleton getInstance() {
  5. if (instance == null) {
  6. instance = new Singleton();
  7. }
  8. return instance;
  9. }
  10. }

3. 线程安全的懒汉式

使用同步块确保线程安全,但会降低效率。

  1. public class Singleton {
  2. private static Singleton instance;
  3. private Singleton() {}
  4. public static synchronized Singleton getInstance() {
  5. if (instance == null) {
  6. instance = new Singleton();
  7. }
  8. return instance;
  9. }
  10. }

4. 双重校验锁(Double-Checked Locking)

在多线程环境下,更高效的方式。

  1. public class Singleton {
  2. private static volatile Singleton instance;
  3. private Singleton() {}
  4. public static Singleton getInstance() {
  5. if (instance == null) {
  6. synchronized (Singleton.class) {
  7. if (instance == null) {
  8. instance = new Singleton();
  9. }
  10. }
  11. }
  12. return instance;
  13. }
  14. }

5. 静态内部类

利用类加载机制,实现延迟加载和线程安全。

  1. public class Singleton {
  2. private Singleton() {}
  3. private static class Holder {
  4. private static final Singleton INSTANCE = new Singleton();
  5. }
  6. public static Singleton getInstance() {
  7. return Holder.INSTANCE;
  8. }
  9. }

6. 枚举(Enum)

实现单例的最佳实践,线程安全且可防止反序列化。

  1. public enum Singleton {
  2. INSTANCE;
  3. // 可以添加其他方法
  4. public void someMethod() {
  5. // 实现方法
  6. }
  7. }

总结

单例模式简单而常用,但在多线程环境下需要注意线程安全的问题。选择具体实现方式时,需要综合考虑系统需求、开发成本和运行效率。枚举单例是推荐的实现方式,因其天然的线程安全和简单性。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
力挽狂澜 关注 已关注

最近一次登录:2024-11-21 00:10:26   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图