Java设计模式超详解--单例设计模式(含uml图)

一,初步理解

图片来源:菜鸟教程

如图所见,单例设计模式就是确保一个类只有一个实例

如现在的图中就是:

SingleObiect中只有一个实例,如果想得到这个唯一的实例,则需要

SingletonPatternDemo通过调用SingleObject.getInstance()

SingleObiect返回唯一的实例instanceSingletonPatternDemo

单例模式分为懒汉式和饿汉式,接下来为大家详细介绍

二,上题目

要求定义一个类A,该类A只能被实例化为一个唯一的对象!

本题对应的公共类和main函数定义如下:

java 复制代码
public class Main {
    public static void main(String[] args) {
        A o1 = A.getInstance();
        A o2 = A.getInstance();
        if (o1.equals(o2)) {
            System.out.println("o1与o2是同一个对象!");
        }
    }
}

请完成A类的代码

显而易见,这里的Main 类就上述通用类图中的SingletonPatternDemo

那我们要完成的就是SingleObiect,也就是题目需要的A类啦

为大家分别介绍懒汉式和饿汉式:

理解懒汉式

为什么叫懒汉呢?先看代码:

java 复制代码
class A {
    // 1. 声明静态实例,但不立即初始化(懒加载)
    private static A instance;
    
    // 2. 私有化构造方法
    private A() {}
    
    // 3. 静态获取方法:首次调用时才创建实例
    public static A getInstance() {
        if (instance == null) { // 判空:为空才创建
            instance = new A();
        }
        return instance;
    }
}

可以看出,平时对instance是不管的,声明一个就放在那

要用的时候才懒洋洋的new一个对象

所以是懒汉式

关键:懒汉式怎么实现唯一实例的呢?

3个方面:

|---------------------------------------------------------------------------------|---------------------------|
| java private static A instance java public static A getInstance() | 声明静态实例与静态方法,不允许后续修改逻辑 |
| java private A() {} | 私有构造方法,不允许另外的对象创建 |
| java if (instance == null) { instance = new A(); } | 非空不创建,保证只有一个实例 |


理解饿汉式

依旧先看代码

java 复制代码
// 单例模式(饿汉式)实现,保证唯一实例
class A {
    // 1. 私有化静态实例:类加载时就创建唯一实例,保证全局唯一
    private static final A instance = new A();
    
    // 2. 私有化构造方法:禁止外部通过new创建实例
    private A() {}
    
    // 3. 公共静态方法:提供全局访问点,返回唯一实例
    public static A getInstance() {
        return instance;
    }
}

可以看出,与懒汉不同,饿汉一开始就迫不及待创建实例,显然是饿了

所以是饿汉式

关键:饿汉式怎么实现唯一实例的呢?

3个方面:

|-------------------------------------------------------------------------------------------------|---------------------------------------|
| java private static final A instance = new A() java public static A getInstance() | 私有化静态实例:类加载时就创建唯一实例,保证全局唯一(final) |
| java private A() {} | 私有构造方法,不允许另外的对象创建 |
| | |

三,总结

单例模式(Singleton Pattern)

意图

确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

主要解决

频繁创建和销毁全局使用的类实例的问题。

何时使用

当需要控制实例数目,节省系统资源时。

如何解决

检查系统是否已经存在该单例,如果存在则返回该实例;如果不存在则创建一个新实例。

关键代码

构造函数是私有的。

设计模式系列持续更新,欢迎关注博主~

希望对大家有用,祝您开心~(o゜▽゜)o☆,有问题欢迎交流,俺会改的✊

相关推荐
TDengine (老段)几秒前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
码上有光4 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦1681 小时前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
触底反弹1 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白12 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求