Java设计模式 _创建型模式_单例模式(懒汉式,饿汉式)

embedded/2024/9/18 12:47:17/ 标签: 设计模式, 单例模式

一、单例模式

1、单例模式(Singleton Pattern)是一种创建对象的设计模式。一个类负责创建自己的对象,同时确保只有1个对象被创建,这个类提供了一种访问其唯一的对象的方式,不需要在实例化该类的对象。从而保证了这个类在全局仅有一个实例,避免这个类频繁地创建与销毁。

2、实现思路:
(1)、该类中定义该类的实例属性,私有化。
(2)、该类定义构造方法也私有化。
(3)、提供public的方法获取实例对象(如果有实例直接返回,没有实例,创建实例后在返回)

二、代码示例

1、懒汉式(不推荐)
特点:先不创建该类的实例,在获取实例的方法中,根据判断,如果不存在才生成和返回。
存在问题:懒汉式在多线程并发时,存在线程安全隐患,线程不安全。(后者运行的new方法,可能会覆盖掉前者运行new的赋值)
代码示例:

public class Rose {// 私有化本例对象,不初始化private static Rose rose;// 私有化构造方法private Rose() {}// 公有化获取方法public static Rose getInstance() {if (rose == null) {rose = new Rose();}return rose;}public static void main(String[] args) {Rose r = Rose.getInstance();Rose r1 = Rose.getInstance();System.out.println(r==r1);     // 结果返回true,可以看到两个实例实际上是一个对象}
}

2、饿汉式(推荐)

特点:在加载这个类的时候就创建了这个类的实例,在获取的方法中直接返回。
存在问题:会在类装载的时候就占用一定的内存空间,如果该类的方法没有用到,就造成一定的内存浪费。不过相对现如今的服务器而言,一点点的内存影响并不是很大,相对懒汉式而言,这种方式多线程下也安全,推荐用此例。
代码示例:

public class Peony {// 私有化本例对象,不初始化private static Peony peony = new Peony();// 私有化构造方法private Peony() {}// 公有化获取方法public static Peony getInstance() {return peony;}public static void main(String[] args) {Peony r = Peony.getInstance();Peony r1 = Peony.getInstance();System.out.println(r==r1);    // 结果返回true,可以看出两个实例实际上是一个对象}
}

学海无涯苦作舟!!!


http://www.ppmy.cn/embedded/18461.html

相关文章

React Router的使用

React Router 是 React 项目的路由库,使用很方便,也是 React 前端项目的主要功能库之一。这里的路由指的是客户端的路由,在客户端路由时,浏览器是不会发送页面请求的,只会发送数据请求。 安装依赖 npm install react…

ios不兼容Svg Wave的动画的解决方法

近日也是用上了SvgWave,十分的好看 Svg Wave - A free & beautiful gradient SVG wave Generator. 大家感兴趣的也可以了解一下 【场景】 使用SvgWave的Animate,并生成svg代码使用,windows web端、朋友的安卓移动端都能够正常执行动画…

企业微信开发

侧边栏开发 企业内应用 创建应用 录入必要信息 配置 网页授权及JS-SDK 需要按照提示,把认证的txt暴露出来,能够访问即可。 下图为认证成功的截图 配置侧边栏工具栏 录入页面名称(tab页展示名)、页面URL 配置授权可信ip 用于…

RabbitMQ各组件参数详解(9)

这里对各个组件的参数进行详解,可能前面有提到过,这里做一个汇总 交换机 在创建交换机的时候用到建造者类ExchangeBuilder,会创建四种交换机 Direct Exchange 直连交换机是 RabbitMQ 中最简单的交换机类型之一。它的工作方式非常简单&…

解决ax = Axes3D(fig2)pycharm画3d图空白不显示问题

明明代码运行正确,却总是显示不出来 绘制出来的也是空白 改一下代码就好了 ax Axes3D(fig2) #原来代码 ax fig2.add_axes(Axes3D(fig2)) #改后代码 修改过后就可以显示了

汽车驾驶3D模拟仿真展示系统更立体直观

随着新能源汽车的普及,它已成为现代生活中不可或缺的交通工具。并且国产车的崛起,其设计与零部件制造水平已能与合资车相媲美,因此汽车维修技能的学习变得尤为重要。汽车维修3D仿真教学软件应运而生,为广大学员提供了一个直观、高…

C语言--基础面试真题

1、局部变量和静态变量的区别 普通局部变量和静态局部变量区别 存储位置: 普通局部变量存储在栈上 静态局部变量存储在静态存储区 生命周期: 当函数执行完毕时,普通局部变量会被销毁 静态局部变量的生命周期则是整个程序运行期间&#…

【随想录】Day34—第八章 贪心算法 part03

目录 题目1: 1005. K 次取反后最大化的数组和1- 思路2- 题解⭐ K 次取反后最大化的数组和 ——题解思路 题目2: 134. 加油站1- 思路2- 题解⭐ 加油站 ——题解思路 题目3: 135. 分发糖果1- 思路2- 题解⭐ 分发糖果 ——题解思路 题目1: 1005. K 次取反后最大化的数组和 题目链…

Python自学之路--003:PyCharm新建工程之后安装的Python第三方库找不到问题

目录 1、概述 2、问题原因 3、解决办法 3.1、.py文件通过.bat不能调用 3.2、通过调用之前PyCharm工程的解释器找到库 3.3、重新安装一遍或将库Copy到新工程的.venv里面 1、概述 通过PyCharm新建一个工程的时候发现,之前安装的python库没了,如下图。…

TP8 利用jwt 生成token

使用Composer安装依赖库&#xff0c;终端切换到项目根目录输入如下 composer require firebase/php-jwt 下面是示例代码&#xff1a; <?php namespace app\common\base;use Firebase\JWT\JWT; use Firebase\JWT\Key;class Token {/*** 创建 token* param array $data 必填…

【LLM】系统的评估与优化

文章目录 系统的评估与优化评估 LLM 应用的方式人工评估简单自动评估使用大模型进行评估混合评估 评估并优化生成部分提升直观回答质量标明知识来源&#xff0c;提高可信度构造思维链增加一个指令解析 评估并优化检索部分评估检索效果优化检索的思路 思考对比各种LLM评估方法的…

boa交叉编译(移植到arm)

参考&#xff1a;CentOS7 boa服务器的搭建和配置-CSDN博客 以下操作在宿主机/编译平台操作&#xff1a; 1. 先执行[参考]1到3、 4.2、4.3、4.4、4.5 2. 修改MakeFile # 由以下&#xff1a; CC gcc CPP gcc -E # 改为&#xff1a; CC arm-linux-gnueabihf-gcc CPP arm-l…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

现实与虚幻:人工智能的迷惑瞬间

在当今社会&#xff0c;随着人工智能技术的迅速发展和普及&#xff0c;越来越多的公司纷纷推出自己的AI大模型&#xff0c;各类应用也开始内置AI玩法&#xff0c;如抖音的AI特效等。然而&#xff0c;随之而来的是人们在使用过程中频繁遇到的让人怀疑的问题&#xff0c;引发了对…

代码随想录算法训练营Day9 | 双指针总结归纳:

截止目前为止&#xff0c;已经刷过十道有关于双指针的题了&#xff1a; 1.对于数组而言&#xff0c;数组上的元素不能做到删除&#xff0c;只能进行覆盖&#xff0c;通过两个指针在一个for循环下完成两个for循环的工作&#xff0c;提升了效率 2.字符串中定义两个指针&#xff…

大模型llama.cp编译

一、大模型部署工具 llama.cpp 二、使用 llama.cpp 量化模型 2.1 克隆llama.cp 项目地址&#xff1a; https://github.com/ggerganov/llama.cpp 一般配置SSH KEY&#xff0c;然后采用SSH克隆。 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make 克隆…

JS中的深拷贝实现方式

在JS中&#xff0c;对象的复制是常见的操作&#xff0c;但有时候我们需要的不仅仅是简单的浅拷贝&#xff0c;而是深度拷贝&#xff0c;即复制对象以及它的所有子对象。这就涉及到了深拷贝的概念。深拷贝与浅拷贝的主要区别在于&#xff0c;深拷贝会复制对象及其所有的子对象&a…

Mac运行npm run serve报错opensslErrorStack

问题描述 mac电脑运行npm run serve报错 opensslErrorStack: [error:03000086:digital envelope routines::initialization error,error:0308010C:digital envelope routines::unsupported],library: digital envelope routines,reason: unsupported,code: ERR_OSSL_EVP_UNSUP…

python 使用flask_httpauth和pyjwt实现登录权限控制

最近需要用到&#xff0c;学习了一下记录 首先安装依赖 pip install Flask-HTTPAuth pyjwt passlib Welcome to Flask-HTTPAuth’s documentation! — Flask-HTTPAuth documentation Welcome to PyJWT — PyJWT 2.8.0 documentation Passlib 1.7.4 documentation — Passl…

源码编译framework.jar 并成功导入android studio 开发

一、不同安卓版本对应路径 Android N/O: 7 和 8 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar Android P/Q: 9 和 10 out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar Android R: 11以上 out/so…