直播软件开发,单例设计模式很简单吗? - 云豹科技

news/2025/9/20 10:30:16/文章来源:https://www.cnblogs.com/yunbaomengnan/p/19102075

直播软件开发,单例设计模式很简单吗?

写在前面

单例设计模式,相信是大家接触设计模式时的入门设计模式,它理解起来比较简单,当然实现起来也很简单,但是别看不上这简单的东西,简单的事情重复做将不再简单,再复杂的事情拆分开来也是由很多简单的事情的集合。接下来来过一遍三种经典的单例模式。

单例模式三个主要特点:

1、构造方法私有化;
2、实例化的变量引用私有化;
3、获取实例的方法共有。

1、双重否定单例模式

public class DCLSingleton implements Serializable {private static final long serialVersionUID = 6242241249985894658L;/*** volatile :内存中可见 和 防止指令重排* 这里主要作用是防止指令重排*/private volatile static DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}public void singletonFunction() {System.out.println("DCLSingleton test.");}
}

2、登记式/静态内部类单例模式

public class StaticSingleton implements Serializable {private static final long serialVersionUID = 5537012394799626447L;private static class SingletonHolder {private static final StaticSingleton INSTANCE = new StaticSingleton();}private StaticSingleton(){}public static final StaticSingleton getInstance() {return SingletonHolder.INSTANCE;}public void singletonFunction() {System.out.println("StaticSingleton test.");}
}

3、枚举单例模式

public enum SingletonEnum {/*** 实例*/INSTANCE;/*** 方法*/public void singletonFunction() {System.out.println("SingletonEnum test.");}
}

测试

以单例性和安全性 2 个方向对以上 3 种单例模式进行测试,看哪种比较适合

1、序列化和反序列化测试单例性

public class TestSerializable {public static void main(String[] args) throws IOException, ClassNotFoundException {System.out.println("----------------双重否定单例模式测试开始-----------------------------");DCLSingleton instance_1 = DCLSingleton.getInstance();ByteArrayOutputStream byteArrayOutputStream_1 = new ByteArrayOutputStream();new ObjectOutputStream(byteArrayOutputStream_1).writeObject(instance_1);ObjectInputStream objectInputStream_1 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream_1.toByteArray()));DCLSingleton singleton_1 = (DCLSingleton) objectInputStream_1.readObject();//com.songo.singletonpattern.service.SingletonPattern1@27c170f0System.out.println(instance_1);//com.songo.singletonpattern.service.SingletonPattern1@3d494fbfSystem.out.println(singleton_1);//DCLSingleton test.singleton_1.singletonFunction();//序列化和反序列化后是否相同:falseSystem.out.println("序列化和反序列化后是否相同:" + (instance_1 == singleton_1));System.out.println("----------------双重否定单例模式测试结束-----------------------------");System.out.println("----------------静态内部类单例模式测试开始---------------------------");StaticSingleton instance_2 = StaticSingleton.getInstance();ByteArrayOutputStream byteArrayOutputStream_2 = new ByteArrayOutputStream();new ObjectOutputStream(byteArrayOutputStream_2).writeObject(instance_2);ObjectInputStream objectInputStream_2 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream_2.toByteArray()));StaticSingleton singleton_2 = (StaticSingleton) objectInputStream_2.readObject();//com.songo.singletonpattern.service.StaticSingleton@7cd84586System.out.println(instance_2);//com.songo.singletonpattern.service.StaticSingleton@30dae81System.out.println(singleton_2);//StaticSingleton test.singleton_2.singletonFunction();//序列化和反序列化后是否相同:falseSystem.out.println("序列化和反序列化后是否相同:" + (instance_2==singleton_2));System.out.println("----------------静态内部类单例模式测试结束---------------------------");System.out.println("----------------枚举单例模式测试结束---------------------------------");SingletonEnum instance_3 = SingletonEnum.INSTANCE;ByteArrayOutputStream byteArrayOutputStream_3 = new ByteArrayOutputStream();new ObjectOutputStream(byteArrayOutputStream_3).writeObject(instance_3);ObjectInputStream objectInputStream_3 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream_3.toByteArray()));SingletonEnum singleton_3 = (SingletonEnum) objectInputStream_3.readObject();//INSTANCESystem.out.println(instance_3);//INSTANCESystem.out.println(singleton_3);//SingletonEnum test.singleton_3.singletonFunction();//序列化和反序列化后是否相同:trueSystem.out.println("序列化和反序列化后是否相同:" + (instance_3==singleton_3));System.out.println("----------------枚举单例模式测试结束---------------------------------");}
}

由程序结果可知枚举单例模式通过序列化和反序列化操作后对象没有改变,单例性够强,此处枚举单例模式完胜

2、通过反射测试安全性

public class Testreflect {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {System.out.println("----------------双重否定单例模式测试开始-----------------------------");DCLSingleton instance_1 = DCLSingleton.getInstance();Constructor constructor_1 = DCLSingleton.class.getDeclaredConstructor();constructor_1.setAccessible(true);DCLSingleton newInstance_1 = (DCLSingleton) constructor_1.newInstance();//com.songo.singletonpattern.service.SingletonPattern1@4d7e1886System.out.println(instance_1);//com.songo.singletonpattern.service.SingletonPattern1@3cd1a2f1System.out.println(newInstance_1);//DCLSingleton test.newInstance_1.singletonFunction();//通过反射得到的对象和原来是否相同:falseSystem.out.println("通过反射得到的对象和原来是否相同:" + (instance_1 == newInstance_1));System.out.println("----------------双重否定单例模式测试结束-----------------------------");System.out.println("----------------静态内部类单例模式测试开始---------------------------");StaticSingleton instance_2 = StaticSingleton.getInstance();Constructor constructor_2 = StaticSingleton.class.getDeclaredConstructor();constructor_2.setAccessible(true);StaticSingleton newInstance_2 = (StaticSingleton) constructor_2.newInstance();//com.songo.singletonpattern.service.SingletonPattern2@2f0e140bSystem.out.println(instance_2);//com.songo.singletonpattern.service.SingletonPattern2@7440e464System.out.println(newInstance_2);//StaticSingleton test.newInstance_2.singletonFunction();//通过反射得到的对象和原来是否相同:falseSystem.out.println("通过反射得到的对象和原来是否相同:" + (instance_2 == newInstance_2));System.out.println("----------------静态内部类单例模式测试结束---------------------------");System.out.println("----------------枚举单例模式测试开始---------------------------------");//枚举没有无参构造方法,这里加上参数SingletonEnum instance_3 = SingletonEnum.INSTANCE;Constructor constructor_3 = SingletonEnum.class.getDeclaredConstructor(String.class,int.class);constructor_3.setAccessible(true);//异常 Cannot reflectively create enum objectsSingletonEnum newInstance_3 = (SingletonEnum) constructor_3.newInstance("test",111);System.out.println(instance_3);System.out.println(newInstance_3);newInstance_3.singletonFunction();System.out.println(instance_3 == newInstance_3);System.out.println("----------------枚举单例模式测试结束---------------------------------");}

由程序结果可知枚举单例模式没有无参的构造方法,即使构造有参的构造方法反射也不通过,报异常 Cannot reflectively create enum objects ,安全性够强,此处枚举单例模式完胜

以上就是直播软件开发,单例设计模式很简单吗?, 更多内容欢迎关注之后的文章

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

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

相关文章

Java开发者的AI革命:如何用JBoltAI应对数智化转型挑战

Java开发者的AI革命:如何用JBoltAI应对数智化转型挑战01 AI时代的浪潮与Java开发者的困境2025年,人工智能技术正以前所未有的速度重塑整个软件产业。根据麦肯锡《2025年技术趋势展望报告》,AI正在从"基础增强器…

JBoltAI:赋能Java老项目快速接入AI能力的创新之道

JBoltAI:赋能Java老项目快速接入AI能力的创新之道近年来,随着人工智能技术的迅猛发展,我们正处在一个从数字化到数智化转型的关键时期。根据2025全球人工智能展望报告,2025年被视为“智能体元年”,AI Agent已成为…

Day04 C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\David\operator Demo01-08+Doc

快捷键 查看源代码:ctrl+B或ctrl+左键 自动对齐:ctrl+alt+I 查看源码:ctrl+alt+Q 运行代码:ctrl+shift+F10 类型转换 byte, short, char->int->long->float->double 变量 //数据类型 变量名 = 值; typ…

实用指南:养老专业实训室建设方案的分级设计与人才培养适配

实用指南:养老专业实训室建设方案的分级设计与人才培养适配pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

物业企业绩效考核制度与考核体系 - 指南

物业企业绩效考核制度与考核体系 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

springboot创建请求处理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java开发生态的数智化升级:JBoltAI如何重塑企业AI应用架构

Java开发生态的数智化升级:JBoltAI如何重塑企业AI应用架构在国务院《关于深入实施"人工智能+"行动的意见》政策引导下,企业数字化智能化转型步伐加快。AI技术与业务场景的深度融合已成为企业创新的核心引擎…

【深度学习计算机视觉】05:多尺度目标检测 - 实践

【深度学习计算机视觉】05:多尺度目标检测 - 实践2025-09-20 10:24 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

Mapper.xml与数据库进行映射的sql语言注意事项

Mapper.xml与数据库进行映射的sql语言注意事项//错误 <update id="updateBatch" parameterType="java.util.List"><foreach collection="list" item="item" index=&…

深入解析:人工智能学习:什么是LSTM模型

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

直播软件搭建,如何实现伪分布式平台部署? - 云豹科技

直播软件搭建,如何实现伪分布式平台部署?大数据平台搭建合集–伪分布式平台部署0.更改主机名并配置hosts映射# 更改主机名 hostnamectl set-hostname master # 配置hosts映射 vi /etc/hosts [填当前机器真是ip] mast…

初步研究vivio的互传的备份数据格式

初步研究vivio的互传的备份数据格式一般来说最大的那个文件是apk, 下面是我的分析,先进入db文件夹,找到000003.log 形如下图的就是apk文件。重命名加上.apk就能单独提取,文件名是hash函数计算过的。 形如下图的就是…

完整教程:C#.NetCore NPOI 导出excel 单元格内容换行

完整教程:C#.NetCore NPOI 导出excel 单元格内容换行pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

resultMap和resultType

resultMap 和 resultType好的,这是一个非常核心的MyBatis面试题和日常开发中的关键知识点。resultMap 和 resultType 都用于指定SQL查询结果的返回类型,但它们的用法和能力有本质区别。 下面我用一个清晰的对比和示例…

RabbitMQ 幂等性, 顺序性 和 消息积压 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

直播软件怎么开发,自适应两栏布局方式 - 云豹科技

直播软件怎么开发,自适应两栏布局方式html结构<body><div class="wrapper"><div class="left"></div><div class="right"></div></div><…

基于SpringBoot的足球论坛系统+论文示例参考 - 指南

基于SpringBoot的足球论坛系统+论文示例参考 - 指南2025-09-20 10:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

resultMap和自定义映射结果形式(ResultMapManage)以及ResultMap Vs ResultType

resultMap和自定义映射结果形式(ResultMapManage)以及ResultMap Vs ResultType<resultMap id="ResultMapManage" type="com.javapandeng.po.Manage"><result property="id" …

嵌入式设备不能正常上网问题

问题描述 设置静态IP和默认网关,设备无法上网。尝试ping baidu.com 也无法ping通 解决方案 1.默认网关IP设置错了 默认网关IP = 路由器IP 当设备在当前的链路中找不到baidu的IP时,会把IP传输到路由器,路由器通过查找…

2、论文固定模板(背景过度结尾)

1、论文字数分配2、以上仅供参考,如有疑问,留言联系