设计模式6——单例模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

单例模式(Singleton)

是一种创建型模式。

目录

一、概述

二、如何使用

三、举例---懒汉式

四、举例---饿汉式


一、概述

1、保证一个类仅有一个实例,并提供一个访问它的全局访问点;
2、在一些场景下,类的实例化应该由自己决定,而不是外部决定的;
3、通常我们可以定义一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让此对象自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法;
4、单例模式封装了他的唯一实例,所以它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。

1.1、主要的角色只有一种:

  • 需要使用单例模式的对象(单个):其中实现方式有两种,分为懒汉式饿汉式

1.2、从上述理论看出使用单例模式主要有2点:

  • 这个对象,它应当可以自己实例化自己
  • 同时它应当不可以被其他对象实例化

1.3、直观的理解上这个对象的关系情况如下:

1.4、从技术实现的角度看,对象的UML图如下:

二、如何使用

  • 隐藏它的构造方法,使得其他对象无法实例化它
  • 给它自己定义一个获取它自己实例的接口,供其他对象使用

三、举例---懒汉式

(用Java实现)

懒汉式单例:

//懒汉式单例
public class Singleton1 {private volatile static Singleton1 instance; //volatile修饰,用来避免一些多线程场景下的问题private Singleton1() {//将构造函数私有化,禁止其他对象实例化它自己}//使得其他类可以得到该实例public static Singleton1 getInstance() {  //用static修饰的方法可以直接通过 类名.方法名 去访问,而无需new对象if (instance == null) {    //实例化被延迟到第一次访问时,并且之后再访问就不会再实例化了synchronized (Singleton1.class) { //synchronized修饰,用来避免一些多线程场景下的问题if (instance == null) {System.out.println("实例化Singleton1"); //标记一下,用来在测试的时候判断被实例化了几次instance = new Singleton1();}}}return instance;}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {//懒汉式Singleton1 s1 = Singleton1.getInstance();Singleton1 s2 = Singleton1.getInstance();System.out.println(s1 == s2);//饿汉式
//        Singleton2 s3 = Singleton2.getInstance();
//        Singleton2 s4 = Singleton2.getInstance();
//        System.out.println(s3 == s4);}
}

四、举例---饿汉式

(用Java实现)

饿汉式单例:

//饿汉式单例
public class Singleton2 {//被static修饰的代码,在程序初始化阶段时就会运行此代码,并且只运行一次,这样保证了只有一个实例private static Singleton2 instance = new Singleton2();private Singleton2() {//将构造函数私有化,禁止其他对象实例化它自己}//使得其他类可以得到该实例public static Singleton2 getInstance() {return instance;}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {//懒汉式
//        Singleton1 s1 = Singleton1.getInstance();
//        Singleton1 s2 = Singleton1.getInstance();
//        System.out.println(s1 == s2);//饿汉式Singleton2 s3 = Singleton2.getInstance();Singleton2 s4 = Singleton2.getInstance();System.out.println(s3 == s4);}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

完成商品属性分组和商品属性关联维护

文章目录 1.前端页面搭建1.复制attrgroup-attr-relation.vue到src/views/modules/commodity下2.加入超链接和引入组件 src/views/modules/commodity/attrgroup.vue1.加入超链接2.引入组件 3.数据池加入变量4.使用组件1.引用组件2.添加方法3.测试,点击关联&#xff0…

建站平台布局结构

建站平台布局结构对于网站的成功至关重要。一个良好的布局结构能够有效地吸引用户,提升用户体验,并且有助于网站的搜索引擎优化(SEO)。在设计网站布局结构时,需要考虑到用户导航、信息层次结构、页面加载速度等方面&am…

Android JetPack快速上手

学习地址 【Android Jetpack组件从入门到入坟,全家桶全面学习教程精讲,通俗易懂】 review 研究生期间接触过一部分android开发,近期有个小项目需要进行开发,临时恶补了一下Android相关知识点,突然发现Android新增了…

VBA语言専攻每周通知20240524

通知20240524 各位学员∶本周MF系列VBA技术资料增加611-615讲,T3学员看到通知后请免费领取,领取时间5月24日晚上18:00-5月26日晚上18:00。本次增加内容: MF611:用InputBox录入日期 MF612:信息提示10秒后关自动关闭 MF613:只是信息提示10秒 MF614:显…

如何解决Nginx反向代理不生效?

目录 背景 过程 日志 检查配置文件 重启服务 检查容器内的配置文件 容器和宿主机 其他 背景 用了两年的nginx新加的反向代理不生效 Docker挂载的配置文件启动的Nginx,配置一切正常,但是反向代理不生效,???先自查一波 过程 日志 …

RDDM论文阅读笔记

CVPR2024的残差去噪模型。把diffusion 模型的加噪过程分解为残差diffusion和noise diffusion,其中残差diffusion模拟从target image到degraded image的过程,而noise diffusion则是原来的diffusion过程,即从图片到高斯噪声的加噪过程。前者可以…

如何让社区版IDEA变得好用

如何让社区版IDEA变得好用 背景 收费版的idea功能非常强大,但是费用高。社区版的免费,但是功能被阉割了。如何才能让社区版Idea变得好用,就需要各种插件支持了。经过全局配置编码,maven,jdk版本,在加上各…

架构二。。

1、CAP 只能3选2 1)一致性(Consistency) 客户每次读都是返回最新的写操作结果 2)可用性(Availability) 非故障节点在合理的时间内返回合理的响应 3)分区容忍性(Partition Tolerance…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的? Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

计算机网络之应用层知识点总结

6.1 网络应用模型 (1)应用层概述 (2)网络应用模型的介绍 客户/服务器(C/S)模型 P2P模型 6.2 域名解析系统DNS (1)DNS系统介绍 (2)域名 (3&#…

学习平台|基于Springboot+vue的学习平台系统的设计与实现(源码+数据库+文档)

学习平台系统 目录 基于Springboot+vue的学习平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3学生功能模块 4教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

不小心丢失mfc140u.dll文件怎么办?mfc140u.dll丢失的解决办法

当您发现mfc140u.dll文件不见了或者受损,别担心,我们可以一起解决这个问题!首先,您可能会注意到一个小提示,当您尝试打开某些程序时,屏幕上会跳出一个消息说“找不到mfc140u.dll”或者“mfc140u.dll文件缺失…

解决docker中container运行闪退终止的问题

在运行bindmount-test时,点击完运行按钮后闪退结束运行。 第一步查看log日志: 2024-05-18 23:46:18 Error: Cannot find module /app/nodemon 2024-05-18 23:46:18 at Function.Module._resolveFilename (internal/modules/cjs/loader.js:668:15) …

2024-5-24 石群电路-15

2024-5-24,星期五,22:15,天气:晴,心情:晴。今天最后一天上班,终于要放返校假啦,开心!!!!!!不过放假也不能耽误…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(八)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 15 节) P15《14.ArkUI组件-状态管理state装饰器》 回到最初的 Hello World 案例,首先验证 如果删掉 State…

物理服务器介绍

物理服务器介绍 概述分类按服务器应用分类按服务器结构分类塔式服务器机架式服务器刀片式服务器机架式服务器与刀片式服务器的对比按处理器个数分类按处理器架构分类 主板概述工作原理物理结构技术参数 CPU概述工作原理指令集相关技术技术参数主流产品 内存概述类型相关技术技术…

C语言-atoi()库函数的模拟实现

文章目录 前言一、atoi()库函数的介绍及使用1.1 atoi()库函数介绍1.2 atoi()库函数使用 二、atoi()库函数的模拟实现2.1 函数设计2.2 函数实现思路2.3 具体实现2.4 测试 总结 前言 本篇文章介绍c语言中库函数atoi()的使用,以及模拟实现库函数。 一、atoi()库函数的…

Threes 特效 炫酷传送门HTML5动画特效

基于Three.js的HTML5 3D动画,这个动画模拟了游戏中的一个炫酷的3D场景,支持360度视角查看,也支持鼠标滚轮进行缩放。画面中主要展现了一个游戏中传送门的效果,同时还有路两边的围栏、灯笼、石头,以及星光闪闪的萤火虫&…

IO端口编址

统一编址 特点 独立编址 特点 内存地址分配 区别 应用 IO端口地址译码 硬件上的实现 示例1: 示例2: IO指令 软件上的实现 示例

2024最佳画图软件合集,操作简单无需下载!

随着数字时代的到来,绘画软件已经成为创造性表达和艺术创作不可或缺的工具。无论你是设计师、艺术家,还是只是对创作充满热情,2024年的绘画软件集都为你提供了各种各样的选择,这样你就可以在数字画布上释放你的想法。本文将重点推…