当前位置: 首页 > news >正文

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

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

写在前面

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

单例模式三个主要特点:

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.hskmm.com/?act=detail&tid=10462

相关文章:

  • Java开发者的AI革命:如何用JBoltAI应对数智化转型挑战
  • JBoltAI:赋能Java老项目快速接入AI能力的创新之道
  • Day04 C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\David\operator Demo01-08+Doc
  • 实用指南:养老专业实训室建设方案的分级设计与人才培养适配
  • 物业企业绩效考核制度与考核体系 - 指南
  • Java开发生态的数智化升级:JBoltAI如何重塑企业AI应用架构
  • Mapper.xml与数据库进行映射的sql语言注意事项
  • 直播软件搭建,如何实现伪分布式平台部署? - 云豹科技
  • 初步研究vivio的互传的备份数据格式
  • 完整教程:C#.NetCore NPOI 导出excel 单元格内容换行
  • resultMap和resultType
  • 直播软件怎么开发,自适应两栏布局方式 - 云豹科技
  • resultMap和自定义映射结果形式(ResultMapManage)以及ResultMap Vs ResultType
  • 嵌入式设备不能正常上网问题
  • 2、论文固定模板(背景过度结尾)
  • go: 图片文件上传
  • go: 生成缩略图
  • git: 报错: fatal: 协议错误:错误的行长度字符串:This 或 fatal: protocol error: bad line length character: This
  • jquery: Justified gallery
  • 安装crmeb
  • gin: 用zap记录访问日志
  • gin: 打包模板文件、静态文件到二进制文件中
  • gin: 判断是否ajax请求
  • gin: 静态文件
  • 详细介绍:【论文精读】基于YOLOv3算法的高速公路火灾检测
  • MacOS 下fuzz学习踩坑点
  • An Empirical Study on Commit Message Generation using LLMs via In-Context Learning 论文笔记
  • 实用指南:人工智能学习:Transformer结构中的编码器层(Encoder Layer)
  • vcpkg 安装依赖
  • Java03课前问题列表