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

二十三种模式之单例模式(基础了解)

1.设计模式的分类

  1. 创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
  2. 结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
  3. 行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2.类比电影院来讲解单例模式及其特点

想象一下,你住在一个小镇上,这个小镇有一个非常特别的电影院,这个电影院有一个非常独特的规定:无论有多少人想看同一部电影,电影院都只会放映一场。这个电影院就像是我们的单例模式。

  1. 唯一性:就像这个小镇上只有一个这样的电影院,单例模式确保了一个类只有一个实例。不管有多少人(代码中的多个部分)想看(使用)这场电影,他们都必须去这个唯一的电影院(实例)。

  2. 控制访问:在电影院,你需要买票才能进入。单例模式也提供了一个全局的访问点(比如一个静态方法),就像买票的窗口,通过这个窗口来获取那个唯一的实例。

  3. 资源管理:电影院需要管理放映机、座位和其他资源。单例模式通过控制实例的创建,可以更好地管理资源,避免资源的浪费。

  4. 线程安全:如果小镇上的电影院同时有很多人想看同一部电影,电影院需要确保同时只能有一个人买到票。在代码中,单例模式需要确保在多线程环境下,也只有一个实例被创建,这通常通过加锁等机制来实现。

  5. 延迟加载:电影院可能只有在有人想看的时候才开始放映电影。类似地,单例模式可以实现延迟加载,即直到真正需要使用这个实例时才去创建它。

  6. 状态共享:如果小镇的居民在电影放映后讨论剧情,他们讨论的是同一场电影。在单例模式中,多个部分的代码可能会修改同一个实例的状态,这种状态是共享的。

3.核心思想:

确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。

4.单例模式的实现通常包括以下几个关键点:

  1. 私有构造函数:确保不能通过构造函数在类的外部创建实例。

  2. 私有静态变量:用于存储类的唯一实例。

  3. 公有静态方法:用于获取类的唯一实例,如果实例不存在,则创建它。

5.简单代码实例:

public class Singleton {// 私有静态变量,用于存储类的唯一实例private static Singleton instance;// 私有构造函数,防止外部通过new创建实例private Singleton() {}// 公有静态方法,用于获取类的唯一实例public static Singleton getInstance() {if (instance == null) {// 同步代码块,确保线程安全synchronized (Singleton.class) {// 再次检查实例是否为null,防止多线程环境下创建多个实例if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个例子中,getInstance() 方法首先检查 instance 是否为 null,如果是,则进入同步代码块。在同步代码块内部,再次检查 instance 是否为 null,如果是,则创建一个新的 Singleton 实例。这样做可以确保即使在多线程环境下,Singleton 类也只会被实例化一次。

测试代码:

@Test
public void testSingletonInstance() {Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();assertEquals("单例模式失败,应该返回同一个实例", instance1, instance2);
}

assertEquals:这是JUnit提供的一个断言方法,用于验证实际结果是否与预期结果相匹配。第一个参数是错误信息,当测试失败时会显示这条信息;第二个参数是预期的结果,这里是instance1;第三个参数是实际的结果,这里是instance2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 内部类java
  • 搭建多协议的串口服务器流程:RS-232、RS-485和TCP/IP、MQTT网络协议(代码示例)
  • 主机安全管理系统是什么?企业系统购买指南:2024年5款最佳选择
  • 区县邻近矩阵和区县质心距离矩阵
  • 如何选择AQL对应不同类型的产品?
  • 【数模资料包】最新数模国赛word+latex模版|数模常用的算法python+matlab代码
  • 304状态码
  • SOMEIP_ETS_067: UINT8Array_with_Length_0_strips_Payload
  • 应用程序编程接口 (API) — 简单解释
  • 飞睿智能家居人体微动感知雷达模组,宠物喂食器、LED灯控连续波雷达感应开关原理
  • 计算机网络信息安全,零基础入门到精通,收藏这一篇就够了!
  • TTS 文本 vs SSML
  • MIT APP Inventor服务器版编译
  • 关于平扫和增强磁共振的思考
  • Gradle安装保姆级教程
  • JavaScript-如何实现克隆(clone)函数
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android开源项目规范总结
  • CAP 一致性协议及应用解析
  • HTTP那些事
  • Javascript编码规范
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MaxCompute访问TableStore(OTS) 数据
  • PAT A1120
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SSH 免密登录
  • VuePress 静态网站生成
  • 多线程事务回滚
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一些关于Rust在2019年的思考
  • 《码出高效》学习笔记与书中错误记录
  • 大数据全解:定义、价值及挑战
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​卜东波研究员:高观点下的少儿计算思维
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #Z0458. 树的中心2
  • #每天一道面试题# 什么是MySQL的回表查询
  • (20050108)又读《平凡的世界》
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (7)STL算法之交换赋值
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十)c52学习之旅-定时器实验
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)Thymeleaf用法——Thymeleaf简介
  • .NET MVC之AOP
  • .net 无限分类
  • .Net组件程序设计之线程、并发管理(一)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • :=
  • :class的用法及应用