23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

news2024/11/18 7:45:18

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

在这里插入图片描述


每博一文案

世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了。
但当我们咬牙坚持过那段难熬的时光后,发现并没有想象中的那么难,就像村上春树说的一句话:每个人
的生命中都有最艰难的那一年,等你迈过去了,人生就会变得高远,辽阔,生活总是泥沙俱下,每个看似百毒不侵的
成年人,都有无数次绝望和崩溃的时刻,要走的路已经选定了,该怎么走,走多久,都是命中注定的,走多久都是命中注定。
在一切变好之前,我们总要经历一段不开心的日子。这段日子也许很长,也许只是一觉醒来,人只有不断地经历,跌倒后,
才能顽强与坚毅的性格。
作家三毛说过这样一句话:世间的人和事,来和去都有它的时间,我们只需要把自己修炼成最好的样子,然后静静地去等待就好了。
人生在世,每个人,都有自己的困境,每个人都有自己的深渊,每个人都有可能摔进去,但每个生命都有属于自己绽放时刻。
这一生挫折会来,也会过去,热泪会留下,也会收起,每个阳光下开怀大笑的人,都有一段沉默的时光。
当我们走过难熬的岁月。回首往昔,当初的脆弱,早已变成勇敢,成为了我们攻坚克难的坚硬的铠甲。
愿你纵使孤身一人,也可以将这场生命旅程走得光灿明亮,自由坦荡。
                                                    ——————   一禅心灵庙语

文章目录

  • 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
    • 每博一文案
    • 1. 单例设计模式
      • 1.1 单例设计模式的优点
      • 1.2 单例设计模式的应用场景
    • 2. 单例设计模式:饿汉式
      • 2.1 饿汉式的优缺点:
    • 3. 单例设计模式:懒汉式
      • 3.1 懒汉式的优缺点:
    • 4. 总结:
    • 5. 最后:


1. 单例设计模式

设计模式: 是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去了我们自己再思考和摸索。就像经典的棋谱,不同的棋局,我们用不同的棋谱,”套路“,也像数学中的公式,不同的问题使用不同的套用不同的公式。

所谓类的单例设计模式 : 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象的实例的方法。

如果我们要让在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为 private ,这样,就不能用 new 操作符

在类的外部产生 类的对象了。但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象(因为我们把构造方法权限改为了 private) ,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

常见的单例设计模式的类:Runtime

在这里插入图片描述


单例设计模式有两个实现的方式:饿汉式 和 懒汉式

1.1 单例设计模式的优点

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决,比如:数据库连接池。一个应用只需要一个数据库连接池就足够了。

1.2 单例设计模式的应用场景

网站的计数器: 一般也是单例模式实现,否则难以同步。

应用程序的日志应用: 一般都使用单例模式实现,这一般是由于共享的日志文件,一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

数据库连接池的设计: 也是采用单例模式,因为数据库连接是一种数据库资源。

项目中读取配置文件的类 ,一般也只有一个对象,没有必要每次使用配置文件数据,都生成一个对象去读取。

Application 也是单例的典型应用。

Windows 的 **Task Manager(任务管理器)**就是很典型的单例模式

WindowsRecycle Bin(回收站) 也是典型的单例应用,在整个系统运行过程中,回收站一直维护着仅有的一个实例。

2. 单例设计模式:饿汉式

饿汉式的实现方式一:

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();

        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }

    // 内部创建实例化对象
    //必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已,如果不是静态的创建一个对象就创建一个了。
    private static Bank instance = new Bank();

    // 提供公共静态的方法,返回当前类的对象(因为对应的属性是静态的了,方法也要是静态的)
    public static Bank getInstance() {
        return instance;
    }
}

在这里插入图片描述

因为获取的对象都是来自同一个地方。所以地址是一样的


饿汉式实现的方式二: 不提供,公共的静态方法,将创建的对象public 公开化。

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.instance;
        Bank bank2 = Bank.instance;

        // Bank.instance = null; // fianl 无法修改
        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }

    // 内部创建实例化对象
    // 必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已
    // 注意附加上 final 防止外部访问修改为了 null,
    public static final Bank instance = new Bank();

    // 提供公共静态的方法,返回当前类的对象

}

在这里插入图片描述


2.1 饿汉式的优缺点:

  • 优点: 线程安全
  • 缺点: 对象加载时间过长

3. 单例设计模式:懒汉式

懒汉式实现如下:

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();

        // Bank.instance = null; // fianl 无法修改
        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }


    // 静态的好通过 类名直接调用
    // 注意附加上 final 防止外部访问修改为了 null,
    private static Bank instance = null;

    // 提供公共静态的方法,返回当前类的对象
    public static Bank getInstance() {
        if(instance == null) {  // 当 instance 为 null 的时候,就创建新的不是空就不创建新的对象
            // 内部创建实例化对象
            instance = new Bank();
        }
        return instance;
    }

}

在这里插入图片描述


3.1 懒汉式的优缺点:

  • 优点: 延迟对象的创建,有需要就创建
  • 缺点: 目前的方式,存在线程不安全问题

4. 总结:

  1. 单例设计模式:就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象的实例的方法。
  2. 单例设计模式两种表现形式:饿汉式 VS 懒汉式
  3. 单例设计模式注意使用 static 修饰实例变量,静态的和类一起加载到内存(方法区)当中,仅仅只加载一次,所有对象共有。
  4. 注意饿汉式的第二种实现的方式:使用 final 关键字,防止被外部调用修改置为了 null

5. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后悔有期,江湖再见!!!


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

居家防护类设备的智能化解决方案

疫情防控政策优化后,你期待的消费暴涨如期而至了吗?近期,继自带“玄学”光环的黄桃罐头被疯抢之后,橘子水、葱姜水、古法掐喉咙消肿等缓解疼痛的“东方神秘法宝”再现各大视频平台。 面对此次居家隔离,哪些产品将再次…

(Java)欢乐的跳

欢乐的跳一、题目描述二、输入格式三、输出格式四、样例(1)样例输入1(2)样例输出1(3)样例输入2(4)样例输出2五、提示六、正确代码七、注意点以及思路(1)注意点…

【万字长文】从Linux零拷贝深入了解Linux I/O

前言 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性: 速度足够快:存储器的存取速度应当快于 CPU 执行一条指令,这样 CPU 的效率才不会受限于存储器容量足够大:容量…

新闻发布系统的设计与实现/新闻管理系统

摘要 21世纪是信息的时代,是网络的时代,进入信息社会高速发展的时代,数字化革命给所有领域带来新的改变。传统的报纸杂志已经远远满足不了人们的需求,人们更加希望于能够在网上了解更多的新闻和信息,网页逐渐融入人们的…

实验二:数据查询实验

【实验目的】 熟练运用SQL语言实现数据查询,包括单表查询、分组查询、连接查询、嵌套查询、集合查询、oralce数据库常用函数等 【实验内容】 根据“数据导入”文档中的语句,将“费用明细表”和“科室字典”2张excel表内容导入数据库。然后拟定以下内容…

力扣刷题笔记day8(二维数组中的查找+旋转数组的最小数字+第一个只出现一次的字符)

文章目录二维数组中的查找题目思路代码旋转数组的最小数字题目思路代码第一个只出现一次的字符题目思路代码二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高…

中级集成和高级信息系统项目管理怎么选?考哪个?

二者只有一个不同,高级需要考论文,如果有时间,有需求,就直接冲高级,一步到位; 下面一起看看两个科目的不同之处: 系统集成项目管理工程师 通过本考试的合格人员能够掌握系统集成项目管理的知识…

linux armhf ubuntu18.04搭建docker

1、开发环境 文件系统版本:ubuntu18.04 armhf 内核版本:linux4.1.15 docker版本:20.10.22 2、ubuntu上安装docker 1、卸载过往的版本 sudo apt-get remove docker docker-ce docker.io containerd runc2、重新更新、安装 sudo apt-get …

vue3+vite +element-plus+tailwindcss兼容低版本浏览器(uc)

部分问题 uc浏览器 rgb支持不全 如rgb(0 0 0 /30%) 这种写法不支持 tailwindcss v3 部分样式在低版本下也不支持 uc浏览器 对于 tailwindcss boxShadow 不支持 主要还是rgb原因 兼容 直接贴出代码 使用 tailwindcss 2.2.16 版本 v3低版本不支持 tailwindcss v2的 jit模式 和…

插值算法基本原理

插值:数据处理的手段 将缺失数据补全处理 线性内插 拉格朗日插值法 牛顿插值 拟合:预测,寻找规律的手段 是插值的外延 插值算法:使用在现有的数据极少,不足以支撑分析的进行,这时就需要使用一些数学方法…

植物激素基因高级分析来啦~

很多植物转录组学文章中,都有整合激素相关基因和表达数据的pathway图,直观地展示通路及其中重要基因的位置和功能。 植物激素(Phytohormone)亦称植物天然激素或植物内源激素,是指植物体内产生的一些微量而能调节&…

排序算法——快速排序

快排 ​ 确定一组数据 ,即q数组 ​ 左端点为了,右端点为r ​ (1)确定分界点 ​ q[l] 或 q[ (l r) / 2] 或 q[r] 或任意一个数 作为分界点,分界点数为x ​ (2)调整区间 (重点&a…

能源监控管理系统|瑜岿科技

瑜岿科技在产业转型升级过程中积极布局智能制造、物联网产业细分领域,拥抱多元化市场。立足市场、顺势而为,以创新理念驱动产业变革,以互联网、物联网思维重塑经营模式,成功打造“碳中和 碳达峰”背景下——能源监控管理系统。 智…

leetCode周赛-317

这里写目录标题题目一:6220.可被三整除的偶数的平均值题目二:6221. 最流行的视频创作者题目三:6222. 美丽整数的最小增量题目四:2458. 移除子树后的二叉树高度题目一:6220.可被三整除的偶数的平均值 AC代码&#xff1…

考研数学练习题-2022年12月23日

日期:2022年12月23日 数量:10

deck.gl 调研

0 结论 deck gl 是基于 WebGL 的数据可视化框架,可以集成在主流的地图框架(arcgis,google maps,mapbox )中使用, 也可以单独使用。 deck gl 通过layer进行数据可视化,支持多种展示效果&#xf…

什么是网络监控?OpManager 网络监控解决方案

什么是网络监控 在当今世界,术语网络监控在整个IT行业中很普遍。网络监控是一个关键的 IT 过程,其中所有网络组件(如路由器、交换机、防火墙、服务器和虚拟机)都受到故障和性能监控,并持续评估以维护和优化其可用性。…

基于防火墙双击热备三层网络规划_ensp综合实验

作者:BSXY_19计科_陈永跃BSXY_信息学院注:未经允许禁止转发任何内容基于防火墙双击热备三层网络规划_ensp综合实验前言及技术/资源下载说明( **未经允许禁止转发任何内容** )插曲:基于eNSP中大型校园/企业网络规划与设…

聊聊首次使用航顺HK32F030C8T6的体验

先说结论,项目基本上开发测试完成了,mcu运行正常。 这个项目是一个智能家居的项目,主板和副板都使用了HK32F030C8T6,这也是笔者第一次使用航顺的芯片。 关于这个芯片的资料,从官网只能下载到datasheet和user mannal的pdf文档&am…

代码随想录训练营第59天|LeetCode 503.下一个更大元素II、42. 接雨水

参考 代码随想录 题目一&#xff1a;LeetCode 503.下一个更大元素II 这个题在496. 下一个更大元素 I基础上数组变成了环&#xff0c;其实两次两次数组就可以了。代码如下&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>&am…