本文介绍: 单例模式(Singleton Pattern)是一种常用的软件设计模式用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例单例模式主要用于控制对某个资源服务访问,确保整个系统中只有一个对象实例负责这些操作。单一实例模式确保一个类只有一个实例存在。通常通过隐藏该类的构造函数,并提供一个静态方法创建获取这个唯一实例全局访问点单例类提供了一个全局访问点,通过这个访问可以访问唯一实例。这通常是一个静态方法,例如。自我实例化。
定义

单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式主要用于控制对某个资源服务访问,确保整个系统中只有一个对象实例负责这些操作

单例模式的关键特点包括:

  1. 单一实例
    • 模式确保一个类只有一个实例存在。通常通过隐藏该类的构造函数,并提供一个静态方法创建和获取这个唯一实例。
  2. 全局访问
    • 单例类提供了一个全局访问点,通过这个访问点可以访问唯一实例。这通常是一个静态方法,例如 getInstance()
  3. 自我实例化
    • 单例类负责创建自己的唯一实例,并确保没有其他实例被创建
  4. 延迟初始化(可选):
解决的问题
使用场景
示例代码
1. 懒汉式(线程安全
public class SingletonLazy {
    private static SingletonLazy instance;

    private SingletonLazy() {}

    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}
  • 优点延迟加载,只有在需要时才创建实例。
  • 缺点线程安全,如果多个线程同时访问,可能会创建多个实例。
2. 懒汉式(线程安全
public class SingletonLazySynchronized {
    private static SingletonLazySynchronized instance;

    private SingletonLazySynchronized() {}

    public static synchronized SingletonLazySynchronized getInstance() {
        if (instance == null) {
            instance = new SingletonLazySynchronized();
        }
        return instance;
    }
}
3. 饿汉式(线程安全
public class SingletonEager {
    private static final SingletonEager INSTANCE = new SingletonEager();

    private SingletonEager() {}

    public static SingletonEager getInstance() {
        return INSTANCE;
    }
}
4. 双重校验锁(线程安全
public class SingletonDoubleCheckedLocking {
    private static volatile SingletonDoubleCheckedLocking instance;

    private SingletonDoubleCheckedLocking() {}

    public static SingletonDoubleCheckedLocking getInstance() {
        if (instance == null) {
            synchronized (SingletonDoubleCheckedLocking.class) {
                if (instance == null) {
                    instance = new SingletonDoubleCheckedLocking();
                }
            }
        }
        return instance;
    }
}
  • 优点:既保证了延迟加载,又保证了线程安全,效率较高。
  • 缺点实现复杂。
5. 静态内部类(线程安全
public class SingletonStaticInnerClass {
    private static class SingletonHolder {
        private static final SingletonStaticInnerClass INSTANCE = new SingletonStaticInnerClass();
    }

    private SingletonStaticInnerClass() {}

    public static SingletonStaticInnerClass getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
6. 枚举方式(线程安全)
public enum SingletonEnum {
    INSTANCE;

    public void doSomething() {
        // 执行操作
    }
}
  • 优点:简单,提供了序列化机制,绝对防止多次实例化。
  • 缺点:不是懒加载模式(非延迟加载)。

每种方法都有其适用场景,根据实际需求选择最合适的实现方式。

主要符合的设计原则:
  1. 单一职责原则(Single Responsibility Principle)
    • 单例模式确保了类有一个单一的职责,即管理自己的唯一实例。这个类负责创建、管理这个实例,并提供一个全局访问点。
  2. 开闭原则(Open-Closed Principle)
    • 单例模式在某种程度上符合开闭原则。一旦单例类被正确实现,它就可以在不修改源代码的情况下保持开放性(例如,可以继承自单例类)。但是,由于单例类控制了实例化过程,扩展其功能可能需要修改源代码,这在某种程度上限制了其对开闭原则的遵循。
  3. 里氏替换原则(Liskov Substitution Principle)
    • 单例模式不完全符合里氏替换原则。由于单例类的构造函数是私有的,子类无法直接继承这个构造函数。如果需要继承单例类,就需要在子类中重写实例控制的逻辑
  4. 接口隔离原则(Interface Segregation Principle)
    • 单例模式并不直接关注接口隔离原则,因为它通常不涉及接口的多重继承。单例类提供的接口是围绕其唯一实例的管理。
  5. 依赖倒转原则(Dependency Inversion Principle)
    • 单例模式可以支持依赖倒转原则。虽然单例对象通常由单例类自身管理,但是单例类可以实现接口,使得高层模块依赖于抽象而不是具体的实例。

综上所述,单例模式主要体现了单一职责原则,但在其他几个设计原则方面的适用性较为有限。它专注于控制类实例的数量,而在继承性和接口设计方面的灵活性不如其他设计模式

在JDK中的应用
  • java.lang.Runtime:
  • java.awt.Desktopjava.awt.Toolkit:
    • 在Java AWT库中,Desktop 类和 Toolkit 类被用来提供平台相关的功能,如桌面或工具包服务。这些类通常以单例模式实现,提供一个全局访问点。
  • Java日志API
    • 在Java日志API中,java.util.logging.LogManager 类被用来维护日志服务的全局状态。它通常被实现为单例,因为全局只需要一个日志管理器
  • Spring框架中的Bean
    • 虽然不是JDK的一部分,但值得一提的是,在Spring框架中,Bean默认是单例的。Spring容器每个Bean定义创建一个且只有一个实例。

这些例子展示了单例模式在Java标准库中的应用,特别是在需要全局访问点和统一管理资源的情况下。单例模式通过确保类的单个实例全局可用,简化了对共享资源或服务的访问和管理。

在Spring中的应用

单例模式在Spring框架中的应用帮助管理了Bean的生命周期和状态,确保了资源的高效利用和应用组件的统一访问。同时,由于Spring容器管理着Bean的创建和销毁,所以它还减轻了开发者处理单例实例化和线程安全问题的负担。然而,使用单例Bean时,需要注意Bean的状态管理,避免因状态共享导致的潜在问题


原文地址:https://blog.csdn.net/haoxin963/article/details/134570968

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_2431.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注