设计模式(2):单例模式

核心作用:

  • 包装一个类只有一个实例,并且提供一个访问该实例的全局访问点。

常见应用场景:

  • windows的任务管理者(Task Manager)就是很典型的单例模式;
  • 在spring中,每个Bean默认就是单例的,这样做的优点是spring容器可以管理;
  • 在servlet编程中, 每个servlet也是单例;
  • 项目中,读取配置文件的类,一般也只有一个对象,没有必要每次使用配置文件数据,每次new一个对象去读取。

单例模式优点:

  • 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其它依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式类解决。
  • 单例模式可以在系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

常见的五种单例模式实现方式:

  • 主要:
    • 饿汉式(线程安全,调用效率高。但是,不能延时加载)
    • 懒汉式(线程安全,调用效率低。但是,可以延时加载)
  • 其它:
    • 双重检查锁(线程安全,可以延时加载。建议使用)
    • 静态内部类(线程安全,调用效率高。并且,可以延时加载)
    • 枚举单例(天生线程安全,调用效率高。但是,不能延时加载)

饿汉式:

/***  饿汉式   --->线程安全,方法没有同步,效率高!但是,没有延时加载优势*  1,构造器私有化,避免外部直接创建对象*  2,声明一个私有的静态属性  并  创建该对象*  3,创建一个对外的公共的静态方法,访问该变量,* @author admin**/
public class SingLeton {/*** 2,声明一个私有的静态属性  并  创建该对象* 			类初始化时,立即加载这个对象(没有延时加载优势),加载类时,天然的是线程安全的!(所有。。)*/	private static SingLeton instance =new SingLeton();/*** 1,构造器私有化,避免外部直接创建对象*/private SingLeton() {}/**3,创建一个对外的公共的静态方法,访问该变量。* 			方法没有同步,效率高!* @return*/public static SingLeton getInstance(){    //return instance;	}
}

懒汉式:

/***	  懒汉式--->线程安全,调用效率不高!但是,可以延时加载*	  1,构造器私有化,避免外部直接创建对象*	  2,声明一个私有的静态属性*    3,创建一个对外的公共的静态方法,访问该变量,如果变量没有对象,创建该对象, * @author admin*/
public class SingLeton {/*** 类初始化时,不初始化这个对象(延时加载,真正用的时候在创建)*/private static SingLeton instance;/*** 私有构造器只供自己使用*/private SingLeton() {}/*** 方法同步,效率低* @return*/public static synchronized SingLeton getInstance(){if(null==instance){instance =new SingLeton();}return instance;}
}

静态内部类:

/*** ͨ 通过静态内部类实现単例模式* 这种方法:线程安全,调用效率高,并且实现了延时加载* @author admin*/
public class SingLeton {	/*** 只有调用getInstance()方法时,这个类才会被加载* @author admin*/private static class SingLetonInstance{private static final SingLeton instance=new SingLeton();} 	private SingLeton() {}	/*** 方法没有同步,效率高!* @return*/public static SingLeton getInstance(){return SingLetonInstance.instance;	}	
}

枚举单例

/**
* 		枚举式实现単例模式!(没有延时加载)
* 		可以天然防止反射和反序列化漏洞
* @author admin
*/
public enum SingLeton{/*** 这个枚举元素,本身就是単例对象*/Instance;	/*** 可以添加自己需要的操作*/public void SingLeton(){}
}

双重检查锁

/*** 通过双重检查锁实现単例模式*  线程安全,可以延时加载。建议使用* @author admin*/
public class Singleton {private static volatile Singleton instance;private Singleton() {}public Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

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

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

相关文章

Kubernetes概念:服务、负载均衡和联网:1. 服务(Service)

服务(Service) 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/ Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。 Kubernetes 中 Service 的一个关键目标是让…

荟萃分析R Meta-Analyses 2----发现R

2.1安装R和R Studio 在开始之前,我们必须下载并准备一个计算机程序,该程序使我们能够方便地使用R进行统计分析。目前最好的选择可能是R Studio。该程序为我们提供了一个用户界面,使我们可以更轻松地处理数据、包和输出。最好的部分是 R Studi…

2024/3/25 蓝桥杯

P8739 [蓝桥杯 2020 国 C] 重复字符串 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int k sc.nextInt();sc.nextLine();char[] c sc.nextL…

python编写API接口实现数据筛选、查询与分页

目录 一、背景 二、代码 一、背景 由于系统上需要分页展示数据,并提供按字段筛选数据的功能,于是需要我写个接口,以供前端使用。 接口可以通过python flask框架实现。Flask是一个轻量级的Web框架,它提供了足够的灵活性来构建定…

如何用pycharm运行.sh文件

在PyCharm中运行.sh文件有几种方法&#xff0c;以下是其中一种常见的方法&#xff1a; 创建Shell脚本运行配置&#xff1a; 打开PyCharm&#xff0c;确保您的项目已经打开。 在项目中找到您的.sh文件&#xff0c;右键点击它并选择“Create <your_script_name>.sh”&…

学会Sass的高级用法,减少样式冗余

在当今的前端开发领域&#xff0c;样式表语言的进步已经显著提升了代码组织性和可维护性。Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;作为CSS预处理器的翘楚&#xff0c;以其强大的变量、嵌套规则、混合宏&#xff08;mixin&#xff09;、循环和函数等高…

STM32学习笔记(6_5)- TIM定时器的输出捕获原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

ASR-LLM-TTS 大模型对话实现案例;语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/136305123(llm+tts) https://blog.csdn.net/weixin_42357472/article/details/136411769 (asr+vad) 这里LLM用的是chatglm;电脑声音播报用的playsound 代码: ##运行 python main.pymain.py from multipro…

mac电脑下安装和启动nginx

一,安装homebrew 必须安装了homebrew&#xff0c;可在终端输入命令brew -v查看是否已经安装,没安装的话安装一下: 如果未安装先安装&#xff08;网上很多文章&#xff09; 二,查看nginx是否存在 使用命令:brew search nginx查看nginx是否存在: 不存在的话,就使用brew inst…

记录RK键盘蓝牙搜索不到

说明书 现象 Q键快速闪烁等待回连但是蓝牙搜索不到 过程 使用手机尝试搜索&#xff0c;依旧失败 解决方案 fnw 长按 w键开始闪烁 打开蓝牙搜索 链接成功

mac 系统如何生成秘钥

1.打开终端&#xff0c;输入 cd ~/.ssh 进入.ssh目录&#xff0c;输入 ls 检查是否已经存在SSH密钥。如果看到类似 id_rsa.pub 的文件&#xff0c;说明已经有一对公钥和私钥&#xff0c;不用新建&#xff0c;直接查看就可以&#xff0c;如果没有需要生成新的密钥。 2.在终端输…

软件工程---专业名称

单元测试(Unit Testing):单元测试是一种软件测试方法,用于验证软件中最小的可测试单元(通常是函数或方法)是否按照预期工作。它通过编写测试用例来检查单元的输入和输出,以确保其功能正确性和稳定性。用例图(Use Case Diagram):用例图是一种UML(统一建模语言)图表,…

(三)Qt+OpenCV调用海康工业相机SDK抓拍示例

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a; &#xff08;一&#xff09;QtOpenCV调用海康工业相机SDK示例开发 第二章&#xff1a; &#xff08;二&#xff09;Qt多线程实现海康工业相机图像实时采集 第三章&#xff1a; &#xff08;…

如何在CentOS 7上搭建Redis Cluster ?

在CentOS 7上搭建Redis Cluster的过程涉及到准备环境、安装Redis、配置Redis实例以及初始化集群。下面是详细的步骤&#xff1a; 1. 环境准备 确保系统是最新的&#xff0c;如果你没有添加EPEL仓库&#xff0c;首先需要添加它&#xff0c;因为Redis可能需要从该仓库安装。 s…

许可型DeFi 项目NEOPIN:在合规的框架下推动DeFi的创新

合规化已成 DeFi 的主流方向 过去的几年里&#xff0c;全球金融市场见证了 DeFi 的快速增长。DeFi 通过提供无需中介的交易和借款等金融服务&#xff0c;为用户带来前所未有的便利。然而&#xff0c;其匿名性和去中心化的特性也为监管和安全带来挑战 —— DeFi项目的透明度不足…

Flutter中被屏蔽的概念,Scheduler(调度器)

前言 一切皆Widget&#xff0c;良好的底层设计都会屏蔽底层的逻辑&#xff0c;Java如此&#xff0c;Flutter亦是如此&#xff0c;甚至还有开发者面向Getx编程&#xff0c;那么我们可以做如是类比&#xff0c;Flutter是J2EE, Getx是Spring套件&#xff0c;作为Java后台开发&…

C#自定义控件 生成 与 加入到项目

C#自定义控件生成 在C#中&#xff0c;自定义控件通常是通过继承现有的控件类&#xff08;如UserControl、Form等&#xff09;并添加或修改其属性和方法来实现的。以下是一个简单的示例&#xff0c;演示如何创建一个自定义控件&#xff1a; 首先&#xff0c;创建一个新的Window…

荟萃分析R Meta-Analyses 1

参考&#xff1a;Harrer, M.、Cuijpers, P.、Furukawa, TA 和 Ebert, DD (2021)。 使用 R 进行荟萃分析&#xff1a;实践指南。佛罗里达州博卡拉顿和伦敦&#xff1a;Chapman & Hall/CRC Press。 ISBN 978-0-367-61007-4。 1.1什么是荟萃分析&#xff1f; 它的创始人之一 G…

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后&#xff0c;总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的&#xff0c;反正能用就行。 安装官方驱动的办法其实很简单&#xff0c;现在独立显卡一共就那么几家&#xff0c;最常见的显卡就是Nvidi…

我们是如何在 IDE 中设计 AutoDev 的 AI 编程开发智能体语言与框架?

上周微软发布了自家的 AI 编程和软件开发智能体框架&#xff1a;AutoDev&#xff0c;其与我们开发的 IDE 插件 AutoDev 有颇多的相似之处&#xff0c;特别是一些设计思路&#xff0c;以及在对于辅助软件开发任务的智能体以及一些基础设施上。 稍有不同的是&#xff1a; 交互介质…