什么是单例模式
什么是单例模式
文章目录
- 什么是单例模式
- 1. 单例(单个的实例)
- 2. 单例模式应用实例
- 3. 饿汉式 VS 懒汉式
1. 单例(单个的实例)
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
- 单例模式有两种方式:1) 饿汉式 2) 懒汉式
2. 单例模式应用实例
演示饿汉式和懒汉式单例模式的实现。
步骤如下:
- 构造器私有化 =》 防止其他类直接 new
- 类的内部创建对象
- 向外暴露一个静态的公共方法。getInstance
- 代码实现
package com.xjz.single_;/*** 单例模式[饿汉式]* 1. 只要完成类加载,同步创建好对象, 即使用户没有调用 getInstance() 方法, 对象也会被创建。* 2. 饿汉式不存在线程安全问题*/
public class SingleTon01 {public static void main(String[] args) {//GirlFriend girlFriend = new GirlFriend("小白");//GirlFriend girlFriend = new GirlFriend("小张");//通过方法可以获取 gf 对象GirlFriend instance = GirlFriend.getInstance();System.out.println(instance); //GirlFriend{name='小红红'}GirlFriend instance2 = GirlFriend.getInstance();System.out.println(instance2); //GirlFriend{name='小红红'}System.out.println(instance == instance2); //true// System.out.println(GirlFriend.n1); //构造器被调用 888}
}//只有一个类,GirlFriend
//只能有一个女朋友
class GirlFriend{private String name;public static int n1 = 888;//为了能够在静态方法中,返回 gf对象,需要将其修饰为 static//对象,通常是重量级的对象,饿汉式可能造成了创建了对象,但是还没有是试用public static GirlFriend gf = new GirlFriend("小红红");//如何保障我们只能创建一个 GirlFriend 对象//步骤[单例模式-饿汉式]//1. 将构造器私有化//2. 在类的内部直接创建对象(该对象是 static)//3. 提供一个公共的 static 方法,返回 gf 对象private GirlFriend(String name) {System.out.println("构造器被调用");this.name = name;}//静态的公共方法,用来返回对象public static GirlFriend getInstance(){return gf;}@Overridepublic String toString() {return "GirlFriend{" +"name='" + name + '\'' +'}';}
}
package com.xjz.single_;/*** 演示懒汉式的单例模式* 懒汉式,只有当用户使用 getInstance 时,才返回 cat对象,后面再次调用时,会返回上次创建的 cat对象* 懒汉式存在线程安全问题*/
public class SingleTon02 {public static void main(String[] args) {System.out.println(Cat.n1); //打印666,且不会调用构造器(创建cat对象)Cat instance = Cat.getInstance();System.out.println(instance);//构造器调用,创建cat对象}
}//希望在程序运行过程中,只能创建一个 Cat 对象
//使用单例模式
class Cat{private String name;public static int n1 = 666;private static Cat cat; //默认是 null//步骤//1. 仍然构造器私有化//2. 定义一个 static 静态属性对象//3. 提供一个 public 的 static 方法,可以返回一个 Cat对象//4. 懒汉式,只有当用户使用 getInstance 时,才返回 cat对象,后面再次调用时,会返回上次创建的 cat对象// 从而保证了单例private Cat(String name){System.out.println("构造器调用...");this.name = name;}public static Cat getInstance(){if (cat == null){ //如果还没有创建 cat对象cat = new Cat("小可爱");}return cat;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +'}';}
}
3. 饿汉式 VS 懒汉式
- 二者最主要的却别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
- 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
- 饿汉式存在浪费资源的可能,因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,所以就不存在这个问题。
- 在我们 javaSE标准类中,java.lang.Runtime 就是经典的单例模式[饿汉式]

相关文章:
什么是单例模式
什么是单例模式 文章目录 什么是单例模式1. 单例(单个的实例)2. 单例模式应用实例3. 饿汉式 VS 懒汉式 1. 单例(单个的实例) 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一…...
【Linux从入门到精通】动静态库的原理与制作详解
本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、1 静态…...
【mybatis】mapper.xml中foreach的用法,含批量查询、插入、修改、删除方法的使用
一、xml文件中foreach的主要属性 foreach元素的属性主要有 collection,item,index,separator,open,close。 collection: 表示集合,数据源 item :表示集合中的每一个元素 index :用于…...
c#扩展方法的使用
扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…...
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景
文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配…...
常见指令以及权限理解
常见指令以及权限理解 命令格式: command [-options] parameter1 parameter1 命令 选项 参数1 参数2 1.command为命令名称,例如变化目录的cd等 2.中括号[ ]实际在命令中是不存在的,这个中括号代表可选,通常选项前面会添加一个符号…...
OpenCV基础知识(6)— 滤波器
前言:Hello大家好,我是小哥谈。在尽量保留原图像信息的情况下,去除图像内噪声、降低细节层次信息等一系列过程,被叫做图像的平滑处理(或者叫图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节…...
IOC容器的基础功能设计模式
构造模式 构造器的目的和构造函数一样,但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建,通过提供一大堆的api来丰富简化构造过程,增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的…...
FFmpeg参数说明FFmpegAndroid饺子视频播放器
FFmpegAndroid https://github.com/xufuji456/FFmpegAndroid https://github.com/lipangit/JiaoZiVideoPlayer/tree/develop 饺子视频播放器 ffmpeg 不是内部或外部命令,也不是可运行的程序 或批处理文件 http://www.360doc.com/content/21/0204/15/54508727_9606…...
DNS入门学习:DNS解析生效问题(中科三方)
在修改域名解析记录或DNS服务器之后,DNS解析并不会立即生效,这给很多网站管理者带来了很多困扰,了解DNS解析生效原理以及不同情况下DNS解析生效时间,对于网站管理工作有很大帮助。本文中科三方针对不同情况下DNS解析生效时间做下简…...
Ubuntu22.04编译安装Mysql5.7.35
新升级的ubuntu22.04版本,该版本默认openssl已经升级到3.0,所以编译过程遇到一些问题记录一下。 编译步骤: 安装依赖 gcc g已经安装过就不需要再安装了。 apt-get install cmake apt-get install libaio-dev apt-get install libncurses5…...
C++音乐播放系统
C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道,c是一个一本正经的编程语言,因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧!! 音乐的好处 提升情绪:音乐能够影响我们…...
Django笔记之log日志记录详解
以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能: LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(levelname)s %(message)s,}},handlers: {file_1: {leve…...
vue局部打印多页面pdf
技术背景 html打印程pdf,使用的官方提供的window.print()打印的样式 media print {} 方法一 const printContent this.$refs.bodyright;var textInput printContent.getElementsByTagName("input");for (var i 0; i < textInput.length; i) {textInput[i].se…...
指定或降低Rust 工具链的版本
要更改 Rust 工具链的版本,您可以使用以下命令之一: rustup default stable:使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta:使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly:使…...
数据驱动成功:商城小程序分析与改进
在当今数字化时代,商城小程序成为了企业与消费者之间互动的重要途径。然而,一个成功的商城小程序不仅仅是一个购物平台,更需要通过数据分析不断进行改进和优化,以提升用户体验和营销效果。本文将深入探讨如何利用数据驱动的方式进…...
基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…...
Docker环境安装elasticsearch和kibana
一、安装elasticsearch 创建es-network,让es、kibana在同一个网段: docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…...
【剖析STL】vector
vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是…...
Redis、Memcache和MongoDB的区别
>>Memcached Memcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度…...
基于节点电价的电网对电动汽车接纳能力评估模型研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...
别再只会写脚本了!用Matlab APP Designer给你的数据分析做个可视化界面(附完整代码)
从脚本到交互式应用:用MATLAB APP Designer打造专业数据分析工具 在数据科学和工程领域,MATLAB一直是不可或缺的计算工具。然而,许多用户长期停留在命令行脚本的层面,未能充分发挥MATLAB的完整潜力。本文将带您突破这一局限&#…...
在Windows电脑上玩转酷安社区:这款免费UWP客户端让你告别手机小屏幕
在Windows电脑上玩转酷安社区:这款免费UWP客户端让你告别手机小屏幕 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 还在用手机刷酷安社区吗?是时候体验大屏幕带来…...
如何在PUBG中实现90%的压枪稳定性提升?揭秘罗技鼠标宏的隐藏技巧
如何在PUBG中实现90%的压枪稳定性提升?揭秘罗技鼠标宏的隐藏技巧 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否曾在《绝地求…...
LabVIEW多线程同步:队列、事件、信号量等核心机制详解与实战应用
1. 项目概述:为什么LabVIEW的多线程同步是开发者的必修课?如果你用过LabVIEW,肯定对它的图形化编程和并行执行能力印象深刻。但当你开始构建稍微复杂点的应用,比如一个需要同时采集数据、实时处理、记录日志和更新界面的测控系统时…...
AssetStudio终极指南:5步解锁Unity游戏资源的完整解决方案
AssetStudio终极指南:5步解锁Unity游戏资源的完整解决方案 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and additio…...
基于ARM核心板的工业无线示教器开发全流程解析
1. 项目概述:当工业机器人遇上“掌上大脑”在工业自动化领域,示教器是人与机器人交互的核心枢纽。传统的示教器,往往体积庞大、线缆缠绕、成本高昂,并且高度依赖特定的控制器硬件。作为一名长期混迹于工控和嵌入式开发一线的工程师…...
国内热门的广州租车工厂哪个好
在广州,租车需求日益增长,如何选择一家靠谱的租车工厂成为众多消费者关心的问题。今天,就为大家介绍一家热门的租车企业——广州市白驹旅游汽车有限公司(简称白驹旅汽),并与其他大厂进行对比分析。车辆保障…...
基于Magisk挂载机制的Android HTTPS流量监控完整技术方案
基于Magisk挂载机制的Android HTTPS流量监控完整技术方案 【免费下载链接】httpcanary-magisk 项目地址: https://gitcode.com/gh_mirrors/ht/httpcanary-magisk 现代Android系统安全架构的演进为应用开发者带来了新的技术挑战,特别是在HTTPS流量监控领域。…...
Vue3企业级后台管理系统实战:如何用ant-design-vue3-admin高效构建现代化管理平台
Vue3企业级后台管理系统实战:如何用ant-design-vue3-admin高效构建现代化管理平台 【免费下载链接】ant-design-vue3-admin 一个基于 Vite2 Vue3 Typescript tsx Ant Design Vue 的后台管理系统模板,支持响应式布局,在 PC、平板和手机上均…...
