• 设计模式详解之单例模式


    一、定义

    单例模式是创建型的

    定义:确保一个类只有一个实例,并提供该实例的全局访问点

    组成:使用了一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。

    私有构造函数保证玩了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量

    二、实现

    1、饿汉式

    应用场景:

    1、初始化时就需创建单例

    2、单例对象要求初始化速度快,占用内存小

    原理:

    依赖JVM类加载机制,保证单例只被创建一次

    优点:

    1、线程安全

    2、初始化速度快

    3、占用内存小

    缺点:

    1、创建时机不可控制

    private static Singleton uniqueInstance = new Singleton();

    2、枚举类型

    应用场景:

    1、初始化时就需创建单例

    2、单例对象要求初始化速度快,占用内存小

    原理:

    1、枚举类型 = 不可被继承的类

    2、每个枚举元素 = 类静态常量 = 依赖JVM 类加载机制,保证单例只被创建1次

    3、枚举元素都通过静态代码块来进行初始化

    4、构造方法访问权限 默认 = 私有 (private)

    5、大部分方法都是final

    优点:

    1、线程安全

    2、自由序列化

    3、实现更加简单、简洁

    缺点:

    1、创建时间不可控制

    1. public enum Singleton {
    2. uniqueInstance;
    3. }

    3、懒汉式

    应用场景:

    1、按需、延迟创建单例

    2、单例初始化的操作耗时长

    3、单例的占用内存比较大

    原理:

    1、类加载时,先不自动创建单例

    2、需要时手动创建单例

    优点:

    1、按需加载单例

    2、节约资源

    缺点:

    1、线程不安全

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

    4、同步锁

    应用场景:

    1、按需、延迟创建单例

    2、单例初始化的操作耗时长

    3、单例的占用内存比较大

    原理:

    1、使用同步锁 synchronized 锁住创建单例的方法

    优点:

    1、线程安全

    缺点:

    1、造成过多的同步开销

    5、双重校验锁

    应用场景:

    1、按需、延迟创建单例

    2、单例初始化的操作耗时长

    3、单例的占用内存比较大

    原理:

    锁一:若单例已创建,则直接返回已创建的单例,无需再执行加锁操作

    锁二:防止多次创建单例问题

    优点:

    1、线程安全

    2、节约资源

    缺点:

    1、实现复杂

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

    6、静态内部类

    应用场景:

    1、按需、延迟创建单例

    2、单例初始化的操作耗时长

    3、单例的占用内存比较大

    原理:

    1、在静态内部类里创建单例,在装载该内部类时才会去创建单例
    2、类是由JVM加载,而JVM只会加载1遍,保证只有一个单例

    优点:

    1、线程安全

    2、节省资源

    3、实现简单

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

  • 相关阅读:
    112. 使用自开发的代理服务器解决 SAP UI5 FileUploader 上传文件时遇到的跨域访问错误
    Web漏洞
    【Node.JS】入门
    正式阶段高等数学复习—函数和极限的基本概念
    元宇宙中的情绪与情感探索在军事上的应用
    会议OA项目之我的审批功能
    CSC关于进一步优化国家公派出国留学服务管理工作的通知
    do while循环、嵌套循环、数组简介
    Tensorflow2.x版本initializer正态化变量输出函数
    融合与创新:数据堂骨龄标注工具为医生赋能
  • 原文地址:https://blog.csdn.net/a2285786446/article/details/134032978