【java学习—八】单例设计模式(5)

news2024/11/15 23:18:26

文章目录

  • 1. 相关概念
  • 2. 单例设计模式-饿汉式
  • 3. 单例设计模式-懒汉式
  • 4. 总结


1. 相关概念

    单例:只有一个实例(实例化对象)

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

设计模式就是在我们实际编程过程中,逐渐总结出的一些解决问题的套路

    所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为 private ,这样,就不能用 new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

    在整个软件系统运行过程中,这个类只被实例化一次,以后无论在哪都只调用这一个实例。例如:实例化对象的创建要消耗大量的实践和资源。
    
    问题:使用单例模式解决什么问题?
    答:一般是new对象太费劲,或者频频的new新的对象没有必要。

比如:

package day08;

public class Single {
	public Single() {
		//假设构造中要执行1000行代码,要占用很大的资源,耗时很长(可能需要10秒)
		//每一次new Single对象需要10秒,运行1000行代码
		//像这种情况,就适合使用单例模式,只new一次对象,以后一直就使用这个对象
	}
}

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

Single类:

package day08;

/**
 * 饿汉式的单例模式
 * @author 14532
 *
 */
public class Single {

	//私有的构造,构造方法私有化,调用这个类的人就不能直接使用new来创建对象
	private Single() {
	
	}
	
	//私有的Single类型的类变量
	private static Single single = new Single();
	
	public static Single getInstance() {
		return single;
	}
	
}

Test.java:

package day08;

public class Test {
	public static void main(String[] args) {

		//Single s = new Single();//不能用了
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();
		Single s3 = Single.getInstance();
		Single s4 = Single.getInstance();
		Single s5 = Single.getInstance();
		//上面s1、s2、s3、s4、s5都指向同一个对象

	}
}

在这里插入图片描述

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

    通俗解释:最开始,对象是null,直到有第一个人调用我,才new一个对象,之后所有调用我的都用这个对象。

Single1类:

package day08;
/**
 * 懒汉式单例模式
 * @author 14532
 *
 */
public class Single1 {
	//先私有化构造方法,让外边不能直接new对象
	private Single1() {
		
	}
	
	private static Single1 s1 = null;//懒汉
	
	public static Single1 getInstance() {
		if(s1 == null) {
			s1 = new Single1();
		}
		return s1;
	}
	
}

Test.java:

package day08;

public class Test {
	public static void main(String[] args) {

		Single1 s = Single1.getInstance();
		Single1 s1 = Single1.getInstance();
		Single1 s2 = Single1.getInstance();
		Single1 s3 = Single1.getInstance();
		Single1 s4 = Single1.getInstance();
	}
}

在这里插入图片描述

4. 总结

懒汉式和饿汉式区别:什么时候new对象?
    懒汉式:是在第一次有人调用getInstance方法时来new对象,以后再有人调用getIntance方法直接就返回之前第一次new好的对象。
    饿汉式:是在类加载之后,还没有人调用的时候,就先new好一个对象,以后不论谁来调用getIntance方法都是直接返回之前new好的对象。

注:暂时懒汉式还存在线程安全问题,讲到多线程时,可修复。


下面是java包中一个饿汉式单例模式的应用:
在这里插入图片描述

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

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

相关文章

MTC怎么办理?什么产品需要做MTC?

什么是MTC认证? 欧盟MTC认证也叫EN 10204认证,也叫承压材质认证。主要是对金属,钢材的一个追溯来源。 对于所有风险等级压力设备的承压部件材料及直接焊接到承压部件上的附件, 压力设备制造商必须通过向材料制造商索要保证其可追溯…

Android 应用流量监控实践

背景 得物Apm系统本身包含网络接口性能监控的能力,但接口监控主要关注的是接口的耗时、异常率等信息,没有流量消耗相关维度的统计信息,并且一部分流量消耗可能来自于音视频等其他特殊场景,在接口监控的盲区外。 为了了解用户目前…

EPB功能开发与测试(基于ModelBase实现)

ModelBase是经纬恒润开发的车辆仿真软件,包含两个大版本:动力学版本、智能驾驶版本。动力学版包含高精度动力学模型,能很好地复现车辆在实际道路中运行的各种状态变化,可用于乘用车、商用车动力底盘系统算法开发、控制器仿真测试&…

嵌入式Linux_学习路线+基础知识

嵌入式Linux_学习路线基础知识 一、学习路线 说明:u-boot是一大块学起来需要三到六个月比较耗时,也属于比较落后的知识点,所以暂时不学习,内核也是如此暂时不学习,从应用层入手,先入门再深入 二、Shell指令…

企业CRM系统选型时的一些建议

随着市场环境的变化,越来越多的企业有了使用CRM客户管理系统的需求。市面上那么多的CRM品牌,我们该如何选择呢?下面我们就来说说企业CRM系统选型时的一些建议。 1、明确自身需求 企业要厘清使用CRM的目的:是遇到了只有CRM才能解…

友宝赴港上市能否成为无人零售业领头羊?

北京友宝在线科技股份有限公司(以下简称“友宝”)近日宣布赴港上市,拟募集资金2.35亿港元,这引起了业界和投资者的广泛关注。据了解这已经是友宝第三次冲击港股IPO了,但是至今仍在门外徘徊。 据招股说明书显示&#x…

zfile环境搭建(存储引擎为minio)

zfile项目地址 minio环境搭建参考 本地运行 修改zfile项目配置文件,更改数据库为MySQL(注释掉灰色高亮部分,启用下面的 MySQL 信息并修改为你的数据库信息) ## sqlite #spring.datasource.driver-class-nameorg.sqlite.JDBC #s…

【C++面向对象】3. 友元

文章目录 【 1. 友元函数 】【 2. 友元类 】 友元可以是一个函数,该函数被称为 友元函数;友元也可以是一个类,该类被称为 友元类。友元可以理解为 原类 的 朋友,友元(友元函数和友元类)不是原类的成员&…

【vue3】状态过渡-GSAP插件实现

效果图&#xff1a; 实现代码 安装库&#xff1a;npm install --save-dev gsap 引入&#xff1a;import gsap from gsap <template><div><el-input v-model"num.currNum" type"number" step"20" style"width: 120px;"…

基于多尺度分形残差注意力网络的超分辨率重建算法

1.引言 深度神经网络可以显著提高超分辨率的质量&#xff0c;但现有方法难以充分利用低分辨率尺度特征和通道信息&#xff0c;从而阻碍了卷积神经网络的表达能力。针对此类问题&#xff0c;本章提出了一种多尺度分形残差注意力网络&#xff08;Multi-scale Fractal Residual A…

js快速回顾

组成 书写位置 声明 ![在这里插入图片描述](https://img-blog.csdnimg.cn/83e92ae533714d5bb45d0cbb00d19e20.png)数据类型

【HyperQuest】调参

1 前言 平台网址链接 平台介绍&#xff1a;这是一个网络应用程序&#xff0c;专门为机器学习的初学者设计&#xff0c;可以轻松地通过直觉来选择正确的超参数。 以此篇文章记录我的调参结果和个人总结&#xff0c;如果大家有更好的效果&#xff0c;欢迎留言交流~ 2 调参思路 …

C语言行列式转置

#include<stdio.h> void main() {int a[3][4] { {1,2,3},{4,5,6},{7,8,9} };int b[4][3] {0};int zf sizeof(a) / sizeof(a[0][0]);//总长int row_len sizeof(a) / sizeof(a[0]);//行数int col_len zf / row_len;//列数int i, j, k0,count0;for (i 0; i <row_le…

福建三明大型工程机械3D扫描测量工程零件开模加工逆向抄数-CASAIM中科广电

高精度3D扫描测量技术已经在大型工件制造领域发挥着重要作用&#xff0c;可以高精度高效率实现全尺寸三维测量&#xff0c;本期&#xff0c;CASAIM要分享的应用是大型工程机械3D扫描测量案例。 铣轮是深基础施工领域内工法先进、技术复杂程度高、高附加值的地连墙设备&#xff…

【万字长文】基于阿里云PAI平台搭建知识库检索增强的大模型对话系统

作者&#xff1a;施晨、尹丰彬、张晓雯、李林杨、黄俊 等 写在前面 本方案已在阿里云线上多个场景落地&#xff0c;将覆盖阿里云官方答疑群聊、研发答疑机器人、钉钉技术服务助手等。线上工单拦截率提升10%&#xff0c;答疑采纳率70%&#xff0c;显著提升答疑效率。 本方案…

onebound电商API接口商品数据采集平台:让数据成为生产力!

随着数字化商业时代的到来&#xff0c;API接口已成为电商资源连接利器&#xff0c;也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示&#xff0c;全球互联网企业近3/4的企业持续投入数字化转型&#xff0c;2/3的企业在持续增加投入&#xff0c;从这组数据可以…

内裤洗衣机有用吗?最好用的四款内衣洗衣机测评

相信很多小伙伴往往会因为懒而不想洗内衣&#xff0c;又或者洗内衣时经常会洗不干净&#xff01;这时就很有必要入手一台内衣洗衣机了&#xff0c;当我们洗完澡时&#xff0c;顺手把内衣放入洗衣机内&#xff0c;一键启动即可把我们的内衣洗得干干净净&#xff01;同时还可以为…

企业财务数字化转型怎么才能落地?_光点科技

企业财务数字化转型一直是企业发展中的一个重要议题。在当今数字化的时代&#xff0c;将财务流程纳入数字化转型计划中&#xff0c;不仅能够提高工作效率&#xff0c;还能为企业带来更多的商业机会。那么&#xff0c;企业财务数字化转型如何才能真正落地呢&#xff1f; 企业需要…

Postman环境配置

Postman环境配置 安装Postman安装node.js安装newman安装htmlextra安装git注册163邮箱用163邮箱注册gitee在pycharm中安装gitee详细文档 安装Postman 网址&#xff1a;https://www.postman.com/downloads/ 注册一个账号即可 安装node.js 安装newman npm install -g newman …

【2021集创赛】Arm杯三等奖:基于FPGA的人脸检测SoC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;合肥工业大学 队伍名称&#xff1a;芯创之家 指导老师&#xff1a;邓红辉、尹勇生 参赛杯赛&#xff1a;Arm杯 参赛人员&#xff1a;王亮 李嘉燊 金京 获奖情…