23种设计模式中的单例模式(Singleton Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始

在这里插入图片描述

单例模式介绍

单例模式是指一个类只允许创建一个实例,并提供一个全局访问点。它是一种常用的设计模式,通常用于管理共享资源、配置信息等。

单例模式的基本思想很简单:将类的构造函数定义为私有的,这样外部就无法通过构造函数来创建该类的实例;而通过一种特殊的方法来获取该类的唯一实例。这种特殊的方法通常被称为“getInstance”,它返回该类的唯一实例。由于该类的实例仅有一个,并且由该类自行创建,所以它可以保证全局唯一性,并且可以避免对资源的多重占用。

在实际应用中,单例模式有许多变体,例如懒汉式单例、饿汉式单例、双重检查锁单例、静态内部类单例等。下面我们来逐个介绍它们。

饿汉式单例模式

饿汉式单例模式是最简单的一种单例模式,它在类加载时就创建了实例,因此在程序运行期间不会再次创建实例,保证了全局唯一性。

public class Singleton {
// 在类加载时就创建实例
private static Singleton instance = new Singleton();

// 将构造方法私有化,禁止外部通过构造方法创建实例
private Singleton() {}

// 提供一个公共的访问方法,用于获取该类的唯一实例
public static Singleton getInstance() {
    return instance;
}

}

懒汉式单例模式

懒汉式单例模式是在第一次使用时才进行实例化,可以节省内存空间。但是它需要考虑线程安全问题,否则可能出现多线程下创建多个实例的情况。

public class Singleton {
    // 用 volatile 关键字确保 instance 在多线程下的可见性
    private static volatile Singleton instance = null;
    
    // 将构造方法私有化,禁止外部通过构造方法创建实例
    private Singleton() {}
    
    // 提供一个公共的访问方法,用于获取该类的唯一实例
    public static Singleton getInstance() {
        if (instance == null) { // 如果 instance 为空,就进行实例化
            synchronized (Singleton.class) { // 保证多线程下只有一个线程进行实例化
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

双重检查锁单例模式

双重检查锁单例模式是在懒汉式单例模式的基础上,加入了同步锁来保证线程安全,并且加入了第二次判断,避免多线程下创建多个实例。

public class Singleton {
    // 用 volatile 关键字确保 instance 在多线程下的可见性
    private static volatile Singleton instance = null;
    
    // 将构造方法私有化,禁止外部通过构造方法创建实例
    private Singleton() {}
    
    // 提供一个公共的访问方法,用于获取该类的唯一实例
    public static Singleton getInstance() {
        if (instance == null) { // 如果 instance 为空,就进行实例化
            synchronized (Singleton.class) { // 保证多线程下只有一个线程进行实例化
                if (instance == null) { // 第二次判断,避免多线程下创建多个实例
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类单例模式

静态内部类单例模式是在类加载时会创建一个静态内部类,调用 getInstance 方法时才会去加载该内部类并初始化 INSTANCE 实例。该方式既保证了线程安全,也保证了懒加载和高效访问的特性。

public class Singleton {
    // 将构造方法私有化,禁止外部通过构造方法创建实例
    private Singleton() {}
    
    // 定义一个静态内部类,用于创建 Singleton 的唯一实例
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    // 提供一个公共的访问方法,用于获取该类的唯一实例
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

上面介绍的是四种常见的单例模式,每种单例模式都有其优缺点,根据实际需求进行选择。例如在单线程环境下,可以使用简单的饿汉式单例模式;而在多线程环境下,可以使用双重检查锁或静态内部类单例模式。

图书推荐

本期推荐书籍为《Java语言程序设计》
《Java语言程序设计(基础篇)(原书第12版)》这本书籍为Java经典教材再推新版,畅销20余年,被世界各地的大学选作教材,更新至Java9、10和11,涵盖Java新特性。因其良好的教材内容,此书籍又被誉为“长城书”,非常值得读者阅读。
在这里插入图片描述
在这里插入图片描述

粉丝福利:评论区任意留言可参与活动抽奖(可评论最多五条,抽取三名欧皇)

京东自营购买链接:点击查看详情

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

  • 39
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 67
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威要向诸佬学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值