【设计模式】单例模式 详解

前言:
单例模式 在我们的开发中,是十分重要的
因为在我们 后台开发,甚至 移动端开发 中,最大的一个问题就是 并发问题 和 效率问题
而 使用 单例模式,在一定程度上,可以解决如上两个问题
那么,本篇博文,本人将来讲解 单例模式
单例模式,一共分为 2种:
- 饿汉式
- 懒汉式
那么,本人先来讲解下 饿汉式:
饿汉式:
概述:
在这个类被加载时就创建一个实例,
之后每当用到这个类的对象时,只返回该实例
那么,本人来通过一段代码展示下这个设计模式的使用:
使用展示:
package edu.youzg.design.pattern.single;
public class GoodMan {
//饿汉式
private static GoodMan youzg = new GoodMan();
private GoodMan() {
}
public static GoodMan getGoodMan(){
return youzg;
}
}
那么,本人来验证下这个类遵循了单例设计模式:
package edu.youzg.design.pattern.single;
/**
* @Author: Youzg
* @CreateTime: 2021-05-10 18:58
* @Description: 带你深究Java的本质!
*/
public class YouzgTest {
public static void main(String[] args) {
GoodMan goodMan = GoodMan.getGoodMan();
GoodMan youzg = GoodMan.getGoodMan();
System.out.println(youzg == goodMan);
}
}
现在,本人来展示下运行结果:

可以看到:
Youzg 是一个 GoodMan!😏
接下来,本人来讲解下 懒汉式:
懒汉式:
概述:
当这个类 被用到时 才创建该类的实例
但在创建之后,之后用到的都是该实例
由于是在使用时候去new一个对象,所以我们一定要注意线程安全问题
那么,本人来通过一段代码展示下这个设计模式的使用:
使用展示:
package edu.youzg.design.pattern.single;
public class Fan {
private static Fan fan = null;
private Fan() {
}
public static Fan getFan(){
if(fan == null){
fan = new Fan();
}
return fan;
}
}
那么,本人来验证下这个类遵循了单例设计模式:
package edu.youzg.design.pattern.single;
/**
* @Author: Youzg
* @CreateTime: 2021-05-10 18:58
* @Description: 带你深究Java的本质!
*/
public class YouzgTest {
public static void main(String[] args) {
Fan fan = Fan.getFan();
Fan plmm = Fan.getFan();
System.out.println(fan == plmm);
}
}
现在,本人来展示下运行结果:

可以看到:
Youzg 的 Fan 都是 plmm!😎
懒汉式 与 线程安全问题:
那么,相信看到这里的同学,有一些是有 并发编程 基础的
这些同学可能会觉得本人本篇博文中,所讲解的 懒汉式单例 的 例子,是有 线程安全问题 的。
没错,这里的 懒汉式单例 的 例子,是有 线程安全问题 的!
本人考虑到 本专题 的主题,是 设计模式,并不是 并发
因此,这里本人只讲解 单线程情况下 逻辑合理的例子
如果想要了解 JUC并发 知识点的同学,情况看本人专栏博文《【JUC剖析】专栏总集篇》
那么,至此,单例模式 就讲解完毕了!

浙公网安备 33010602011771号