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

shadowLogo

前言:

单例模式 在我们的开发中,是十分重要的

因为在我们 后台开发,甚至 移动端开发 中,最大的一个问题就是 并发问题效率问题

而 使用 单例模式,在一定程度上,可以解决如上两个问题

那么,本篇博文,本人将来讲解 单例模式

单例模式,一共分为 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剖析】专栏总集篇》


那么,至此,单例模式 就讲解完毕了!

posted @ 2021-05-10 19:12  在下右转,有何贵干  阅读(98)  评论(0)    收藏  举报