【单例模式】—— 每天一点小知识

简介: 【单例模式】—— 每天一点小知识

🐳设计模式之单例模式

引言

设计模式是软件开发中重要的概念之一。单例模式是设计模式中的一种,它用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在本文中,我们将深入探讨单例模式的概念和思想,并介绍几种常见的代码实现方式。


单例模式的概念和思想

 💧单例模式是一种创建型设计模式,其主要目的是限制一个类只能有一个实例,并提供一种访问该实例的方式。这对于需要共享资源控制特定资源访问的场景非常有用。

 💧单例模式的核心思想通过封装构造函数,使得该类无法通过常规的方式创建实例。同时,单例模式还提供一个静态方法或者全局变量来获取该类的唯一实例

常见的代码实现方式 ↓

饿汉式

 💧饿汉式是最简单的单例模式实现方式之一。在该实现中,实例在类加载时就被创建,因此称为"饿汉式"。

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {
        // 私有构造函数
    }
    public static Singleton getInstance() {
        return instance;
    }
}

在上述代码中,我们通过私有的构造函数确保该类无法在外部被实例化。同时,通过静态变量 instance 保存唯一实例,并通过静态方法 getInstance() 返回该实例。

懒汉式

 💧懒汉式是另一种常见的单例模式实现方式。与饿汉式不同,懒汉式在需要时才创建实例。

public class Singleton {
    private static Singleton instance;
    private Singleton() {
        // 私有构造函数
    }
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上述代码中,我们将实例的创建延迟到第一次调用 getInstance() 方法时。这种方式在多线程环境下可能会出现问题,因为多个线程可能同时调用 getInstance() 方法,导致创建多个实例。下面我们将介绍一种改进的懒汉式实现方式。

双重检查

 💧双重检查是一种改进的懒汉式实现方式,通过添加同步块来确保只有一个线程能够创建实例。

public class Singleton {
    private static volatile Singleton instance = null;
    ```java
    private Singleton() {
        // 私有构造函数
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在上述代码中,我们首先检查实例是否已经存在,如果不存在,则进入同步块。在同步块内部,再次检查实例是否为空,如果为空,则创建实例。通过使用 volatile 关键字修饰 instance 变量,确保在多线程环境下对变量的可见性,避免出现创建多个实例的情况。

静态内部类

 💧静态内部类是一种常见的延迟初始化的单例模式实现方式。在该实现中,使用内部类来持有实例,并在需要时进行初始化。

public class Singleton {
    private Singleton() {
        // 私有构造函数
    }
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

在上述代码中,我们将实例的创建放在了静态内部类 SingletonHolder 中。当调用 getInstance() 方法时,会返回 SingletonHolder 中的实例,从而实现了延迟初始化的效果。这种方式利用了类加载的机制来保证线程安全,同时又避免了同步块带来的性能开销。

枚举

 💧枚举是一种简洁且安全的单例模式实现方式。在枚举中,每个枚举常量都是该枚举类型的一个实例。

public enum Singleton {
    INSTANCE;
    // 添加其他成员和方法
}

在上述代码中,我们使用了一个单独的枚举常量 INSTANCE 来表示该单例的实例。通过直接访问枚举常量 INSTANCE,可以获取到该实例。枚举的特性保证了该实例是全局唯一的,同时也提供了线程安全的保证。

总结

通过使用单例模式,我们可以确保一个类只有一个实例,并提供全局访问点来获取该实例。这在需要共享资源或控制资源访问的场景下非常有用。我们在使用单例模式时也需要注意线程安全和性能等方面的考虑。

相关文章
Datatables获取选中行的某一列的数据
Datatables获取选中行的某一列的数据
693 1
PageHelper分页插件拼接动态排序语句
PageHelper分页插件拼接动态排序语句
436 0
|
6月前
|
设计模式 XML JSON
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
195 10
|
缓存 监控 网络协议
掌控全局:Linux 系统性能调优技巧全面指南
掌控全局:Linux 系统性能调优技巧全面指南
|
9月前
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
10月前
|
开发框架 Prometheus 监控
使用阿里云服务网格高效管理LLM流量:(二)流量可观测
本文介绍如何使用阿里云服务网格提供的增强能力灵活、全面的观测集群中的LLM流量。
|
消息中间件 监控 关系型数据库
综合医院LIS系统全套源码,开箱即用,支持二次开发
该实验室管理信息系统采用C# .Net开发,支持多种主流数据库,利用MQ和Remoting实现分布式3层架构。系统强调标本全周期管理,包括采集、检测、报告和归档,集成多种医院系统,提供生化等多个专业报告,智能审核规则,支持危急值管理、微生物培养跟踪,并具备全面的质控和试剂管理功能。系统维护、条码、样本、常规与微生物检验、质控、查询统计、试剂耗材管理以及临床提醒和报告打印等功能一应俱全。
324 5
综合医院LIS系统全套源码,开箱即用,支持二次开发
|
Java 索引
Java“StringIndexOutOfBoundsException”解决
Java中“StringIndexOutOfBoundsException”异常通常在字符串索引超出其边界时抛出。解决方法包括检查字符串长度、确保索引值有效,以及使用条件语句避免越界访问。
603 2
|
算法 调度 UED
深入理解操作系统中的进程调度
【8月更文挑战第29天】操作系统是计算机系统的核心,负责管理硬件资源和提供各种服务。其中,进程调度是操作系统中至关重要的一环,它决定了哪些进程将获得处理器时间以及何时获得。本文将从进程调度的基本概念出发,探讨不同类型的调度算法及其优缺点,并通过实际代码示例加深理解。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和知识。
232 8
Java系列之:字符串的截取及分割 split() 和 substring()
这篇文章通过示例代码讲解了Java中字符串的截取和分割操作,包括使用`split()`方法根据正则表达式进行字符串分割以及使用`substring()`方法进行字符串截取的不同使用方式及其输出结果。
Java系列之:字符串的截取及分割 split() 和 substring()