【JavaEE】Java设计模式-单例模式(饿汉式与懒汉式)

article/2023/6/4 14:29:51

目录

1.设计模式是啥?

 2.单例模式

2.1什么是单例模式 

2.2饿汉模式 

2.3懒汉模式 

3.懒汉模式与饿汉模式的区别 


1.设计模式是啥?

设计模式是前人经过总结,通过对不同应用场景应该运用何种方法解决问题的模式。我们可以将它看成NBA中的战术(例如:电梯门战术),在应对不同的队伍时,需要运用不同的战术,针对不一样的队伍用不一样的战术才能更高效的得分,这就相当于对不同的问题有固定的模板免得去思考,可以直接去使用。故可认为:它是解决待定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以重复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

2.单例模式

2.1什么是单例模式 

这个就看字面意思就很好理解,就是只能有一个例子,也就是该类只能new一个对象。

官方的说就是:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

 目前单例模式有两种:1.饿汉式 2.懒汉式

 如何实现单例模式呢?我们就从者两个模式的具体实现来说明吧!

2.2饿汉模式 

 饿汉式单例模式实现步骤:

1.将构造器私有化

  解释:防止用户构造新对象 

2.在类中创建好一个对象

  解释:因为我们把构造器进行了私有化操作,但我们单例模式中需要有个对象,因此我们需要在类中实例化好一个对象。

3.创建一个方法,或者类中创建好的对象

  解释:因为我们外部不能创建对象,但是我们类中有创建好的对象,因此我们需要一个方法来将对象给取出来。

代码实现: 

class Singleton {private static Singleton instance=new Singleton();public static Singleton getS() {return  instance;}private  Singleton(){};
}
public class testDemo1 {public static void main(String[] args) {Singleton singleton=Singleton.getS();}
}

注意: 

观察代码,有几个细节需要注意;因为用户不可以创建对象,因此我们需要在类中创建好对象,不能创建对象,就意味着我们不能通过对象引用类中的成员方法与成员变量,即在类中new对象时和获得new好的对象时需要用静态成员变量和静态成员方法,通过类名来访问

2.3懒汉模式 

 懒汉式单例模式实现步骤:

1.将构造器私有化

  解释:防止用户构造新对象 

2.在类中创建好一个对象

  解释:因为我们把构造器进行了私有化操作,但我们单例模式中需要有个对象,因此我们需要在类中实例化好一个对象。

3.创建一个方法,或者类中创建好的对象

  解释:因为我们外部不能创建对象,但是我们类中有创建好的对象,因此我们需要一个方法来将对象给取出来。

class  SingleLazy{private static SingleLazy instance=null;public static SingleLazy getInstance() {if(instance==null) {instance=new SingleLazy();}return instance;}private SingleLazy() {}
}
public class testDemo2 {SingleLazy singleLazy=SingleLazy.getInstance();
}

注意:

观察代码,有几个细节需要注意;因为用户不可以创建对象,因此我们需要在类中创建好对象,不能创建对象,就意味着我们不能通过对象引用类中的成员方法与成员变量,即在类中new对象时和获得new好的对象时需要用静态成员变量和静态成员方法,通过类名来访问

与饿汉模式不同之处时,懒汉模式只有在调用到这个对象时,对象才得以创建,在没有调用之前,创建出来的对象时null,懒汉模式要比饿汉模式节省一些不必要的资源。 

3.懒汉模式与饿汉模式的区别 

1.线程安全方面

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,懒汉式本身是非线程安全的,懒汉模式线程不安全是因为,他在创造对象时,会产生指令重排序。

2.资源加载和性能

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。

懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟。 


 写在最后:

以上就是本文全部内容,如果对你有所帮助,希望能留下你的点赞+关注,我会更加努力的更新内容!非常感谢🧡🧡🧡

若本篇文章有错误的地方,欢迎大佬们指正!

http://www.ngui.cc/article/show-1007703.html

相关文章

English Learning - L2-10 英音地道语音语调 鼻辅音 [m] [n] [ŋ] 舌边音 [l] [r] 2023.03.23 周四

English Learning - L2-10 英音地道语音语调 鼻辅音 [m] [n] [ŋ] 舌边音 [l] [r] 2023.03.23 周四课前准备活动和回顾鼻辅音鼻辅音 [m]鼻辅音 [n]鼻辅音 [ŋ]鼻辅音对比鼻辅音发音技巧对应单词对应的句子舌边音舌边音 [l]发音技巧对应单词[l] 和 [n] 的区分舌边音 [r]发音技巧…

基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路

wx供重浩:创享日记 对话框发送:单片机打铃 获取完整无水印论文报告说明(含源码程序、电路原理图和仿真图) 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…

Matlab如何计算功率谱熵?|信息熵之功率谱熵

信息熵 熵的概念最初在热力学中提出,熵的本质被解释为即熵的本质是一个系统“内在的混乱程度”。熵的概念在不同的学科中引申出更为具体的概念,在信息论中信息熵的具体定义为: H(X)p(xi)∑i1n1p(xi)−p(xi)∑i1np(xi)H(X)p(x_i)\sum_{i1}^n \…

扩散模型的数学理解

前置知识:标准高斯分布的乘法:若z~N(0, I),则 n*z~N(0, n^2 * I)。因为期望为0,乘以n后还是为0,但方差为1,乘以n后还要加上平方,所以说是n^2 * I。概率公式中的逗号、分号、竖线:分号…

Vue中的常用指令!!

Vue 中的指令是 Vue 的核心功能之一&#xff0c;用于在模板中添加特殊的标签&#xff0c;使得 DOM 元素和 Vue 实例的数据绑定在一起&#xff0c;实现双向数据绑定和动态更新。下面是常用的 Vue 指令。 v-if 指令&#xff1a;根据条件动态渲染元素 <!-- 根据 show 布尔值的…

【算法基础】欧拉函数

一、欧拉函数 1. 公式法求欧拉函数 2. 筛法求欧拉函数 二、案例分析1 (公式法求欧拉函数) (一)Question 1. 问题描述 2. Input 第一行包含整数 n。接下来 n行,每行包含一个正整数 ai。(1 ≤ n ≤ 100, 1 ≤ ai ≤ 2109) 3. Output 输出共 n 行,每行输出一个正整数…

Python接口自动化 ❀ JsonPath提取器和正则提取器

Python接口自动化 ❀ JsonPath提取器和正则提取器一、前言1.1 正则提取器1.2 正则示例&#xff1a;1.3 JsonPath提取器1.4 JsonPath提取器具体使用一、前言 我们一般在做接口关联时&#xff0c;会通过保存中间变量实现接口关联&#xff0c;在关联时就需要用到变量提取&#xf…

计科数据《算法设计与分析》第3次上机作业

问题 A: 算法10-6~10-8&#xff1a;快速排序 #include<bits/stdc.h> using namespace std; #define int long long #define fer(i,a,b) for(int ia;i<b;i) const int N1e55,mod1e97; int a[N]; int partition(int a[],int l,int r){int il,jr;int xa[l];while(i<j…

Oracle-CDC进程同步报错问题合集

前言: Oracle CDC是数据库自带的数据库数据复制和增量数据抽取工具&#xff0c;提供五种复制模式 1 Synchronous Change Data Capture Configuration(同步复制) 2 Asynchronous HotLog Configuration(异步在线日志CDC) 3 Asynchronous Distributed HotLog Configuratio…

史诗级详解面试中JVM的实战

史诗级详解面试中JVM的实战 1.1 什么是内存泄漏?什么是内存溢出?1.2 你们线上环境的JVM都设置多大?1.3 线上Java服务器内存飙升怎么回事?1.4 线上Java项目CPU飙到100%怎么排查?1.5 线上Java项目OOM了,怎么回事?1.1 什么是内存泄漏?什么是内存溢出? 内存溢出:OutOfMe…