单例模式、工厂模式

news2024/9/23 17:25:22

单例模式、

  • 一、单例模式
    • 1.1 饿汉模式
      • 1.1.1 实现
      • 1.1.2 补充
    • 1.2 懒汉模式
      • 1.2.1 单线程版
      • 1.2.2 多线程版
  • 二、工厂模式

一、单例模式

单例模式是校招中最常考的设计模式之一。

啥是设计模式?
设计模式好比象棋中的"棋谱":红方当头炮,黑方马来跳… 针对红方的一些走法,黑方应招的时候有一些固定的套路,按照套路来走局势就不会吃亏。
软件开发中也有很多常见的"问题场景",针对这些问题场景,大佬们总结出了一些固定的套路,按照这个套路来实现代码,也不会吃亏。

单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例!

这一点在很多场景上都需要,比如 JDBC 中的 DataSource 实例就只需要一个。

注意: 像这样的需求,不依赖单例模式,就只是靠"君子协定"能不能行?也是可以的!但是人总是避免不了犯错,单例模式就是针对上述的需求场景进行了更强制的保证!当创建出多个实例时,就会编译报错~

单例模式具体的实现方式,分成"饿汉"和"懒汉"两种:

1.1 饿汉模式

1.1.1 实现

类加载的同时,创建实例:

class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}    

在这里插入图片描述
同时构造方法是private私有的,不能在类外创建!:
在这里插入图片描述
为什么被叫作"饿汉模式"呢?
在这里插入图片描述

1.1.2 补充

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

y属性是static修饰,静态的;x属性是普通的~:
在这里插入图片描述

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);  // true!!!

1.2 懒汉模式

1.2.1 单线程版

类加载的时候不创建实例,第一次使用的时候才创建实例:

class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}    

1.2.2 多线程版

上述讲解的饿汉模式和懒汉模式,如果在多线程环境下调用getInstance,是否是线程安全的?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

怎么解决???
使用volatile!!!
volatile 有两个功能:1.解决内存可见性问题;2.禁止指令重排序

代码完全体:
在这里插入图片描述

二、工厂模式

举个例子,高中数学课,我们学过笛卡尔坐标系和极坐标系。我们发现,用代码来构造坐标时,两种方法的参数完全一致:
在这里插入图片描述
在Java标准库里,有线程池:
在这里插入图片描述

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

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

相关文章

软件测试人员究竟要掌握什么技能?顺便说下行业现状

最近团队内部产品在做性能测试中碰到一个问题,不仅仅这次性能测试,其实这在我这近10年工作过程中,经常碰到一些类似的事情,今天拿出来一件事说叨说叨。 1、事情经过 月中上线了一个功能,该功能会应对峰值流量&#x…

【安卓APP源码和设计报告(含PPT)——订餐系统

订餐系统实验报告 课程名称: Android程序设计 班 级: 学 号: 姓 名: 任课教师: 程序功能与环境(服务器,手机实物照片,自己拍) 程序功能 餐厅订餐系统服务器&#…

45. python %占位符格式化处理

45. %占位符格式化处理 文章目录45. %占位符格式化处理1.课题导入2. %占位符概念3. %d格式化为整数3.1 %d将整数格式化到指定位置3.2 %d将浮点数格式化为整数1. 知识回顾:用int函数将浮点数转换为整数2. 用%将浮点数格式化为整数4. %s格式化为字符串4.1 %s将整数格式…

论文笔记-时序预测-Triformer

论文标题: Triformer: Triangular, Variable-Specific Attentions for Long Sequence Multivariate Time Series Forecasting 论文链接: https://arxiv.org/abs/2204.13767v1 代码链接: https://github.com/razvanc92/triformer 摘要 各种现…

[附源码]计算机毕业设计基于JEE平台springbt技术的订餐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Spring源码解析-环境变量

“不积跬步,无以至千里”。 今天聊一聊Spring中环境变量的动态添加和填充Bean属性的时候一些带“$”符号的属性值的解析问题。 因为最近做项目的时候发现了一个有意思的问题,之前也没关注过。因为项目中使用的容器类型是GenericXmlApplicationContext&a…

从GPT-3到CHAT-GPT(CHAT-GPT如何申请)

回顾2020年7月 2020年7月份有一个重大新闻,人工智能科研公司OpenAI,推出了它的新一代语言模型 GPT-3(Generative Pretrained Transformer 3),这个事情在社交媒体影响甚广,甚至有一篇文章《一个新型 AI 震惊…

动态代理详解

目录 一、动态代理_代理模式简介 二、动态代理_JDK动态代理 dynamic 三、动态代理_CGLib动态代理 四、JDK和CGLib动态代理的区别 一、动态代理_代理模式简介 代理模式是23种设计模式之一。设计模式是前人总结的,在软件开发过程遇到常用问题的解决方案&#xff0…

微服务框架 SpringCloud微服务架构 微服务保护 30 初识Sentinel 30.4 引入cloud-demo

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护30 初识Sentinel30.4 引入cloud-demo30.4.1 引入cloud-demo30.4.2 微服务整合Sentinel30 初识Sent…

尝试使用CubeMX做stm32开发之十三:Clock Configuration(时钟树配置)

参考《STM32中文参考手册_V10》,研究CubeMX中有关时钟树配置。 一、系统时钟配置 三种不同的时钟源可被用于驱动系统时钟(SYSCLK): HSI振荡器时钟HSE振荡器时钟PLL时钟 时钟源选择对应时钟配置寄存器(RCC_CFGR&…

Android -- 每日一问:修改 SharedPreferences 后两种提交方式有什么区别?

知识点 SharedPreferences 类是一个接口类,真正的实现类是 SharedPreferencesImpl 。修改 SharedPreferences 需要获取它的 Editor,在对Editor进行put操作后,最后通过 commit 或者 apply 提交修改到内存和文件。当然有了两种都可以提交的方法…

Java进程线程介绍创建和执行销毁并理解线程安全和线程池 Native Method

目录1.进程和线程2.多线程的核心3.操作系统的多任务--以非常小的时间间隔交替执行4.native 修饰的方法5.Thread创建线程的两种方式1.普遍采用实现Runnable接口的方式2.继承Thread方式6.自定义线程用 new Thread(Runnable target) 启动源码分析6.1-new Thread(myThread)6.2对实例…

mysql8.0.21安装配置方法图文教程

记录了mysql 8.0.21 的安装配置方法,分享给大家。 一、下载 1、下载安装包 mysql下载路径 2、解压压缩包 3、在此目录下新建my.ini配置文件 [mysqld] # 设置 3306 端口 port3306 # 设置 mysql 的安装目录 basedirD:\mysql-8.0.21-winx64 # 设置 mysql 数据…

破案了!不会讲笑话不会作诗的chatGPT!

热出圈的chatGPT, 必须亲手试试热出圈的chatGPT, 必须亲手试试1 猜猜我是谁2 问网传图片李白风格注释代码3 写个程序看看4 帮我猜猜世界杯(发了发了,偷笑脸)5 知道李白吗?6 那你会写诗吗?6 那你讲脑经急转弯吗&#xf…

linux服务器安装docker(学习中)

linux服务器安装docker1、docker官网寻找官方文档1.1、卸载之前的docker1.2、安装yum工具类1.3、配置docker下载源的地址1.4、安装最新稳定版的docker1.5、启动docker1.6、docker镜像下载加速2、docker-卷-映射和挂载2.1、nginx1、docker官网寻找官方文档 然后根据官网文档进行…

高性能零售IT系统的建设08-9年来在互联网零售O2O行业抗黑产、薅羊毛实战记录及打法

前言 2012年左右转入互联网应用,由于本身在学校时就涉足过远程医疗影像中的DICOM安全领域这块,因此也是机缘巧合我进入互联网第一年就遇上了一次亿级的DDOS攻击以及千万级CC攻击短信系统的对抗。那时在公司一战成名,直接从team leader升到了主…

adb remount原理

1, 输入"fastboot flashing unlock" in adb ,waiting for the device 2, 输入"fastboot flashing unlock_critical"in adb ,waiting for the device 3, 输入"fastboot reboot" reboot the stb, press any key entering the boot mode 4, after…

tensorflow入门(三)tensorflow下神经网络参数的设置

参考 Tensorflow入门 - 云社区 - 腾讯云 神经网络中的参数是神经网络实现分类或回归问题中重要的部分。在tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数的。在tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络的参…

Educational Codeforces Round 123 (Rated for Div. 2) D. Cross Coloring

Problem - D - Codeforces 翻译: 有一张纸,可以用大小为𝑛𝑚:𝑛行和𝑚列的单元格表示。所有的细胞最初都是白色的。 𝑞操作已应用到工作表。他们的𝑖-th可以描述如下: &#x1d4…

前端工程化项目的思考

这是一篇个人使用前端工程开发项目的思考,希望可以帮助到你。完全是一篇综合概念应该是很多东西,我也不清楚会有多少字,估计会对刚刚开始的人看起来比较迷,但也是没有办法的事情 1.前端脚本语言开发的作者我想应该也想不到js会发展…