【JavaEE】单例模式设计

简介: 哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 设计模式中的单例模式,采用两种方式来实现——“饿汉”模式 和 “懒汉” 模式 。确定不来看看嘛~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

 

image.gif编辑

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 设计模式中的单例模式,采用两种方式来实现——“饿汉”模式 和 “懒汉” 模式 。确定不来看看嘛~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

image.gif编辑


一、设计模式

什么是设计模式,通俗易懂的讲:在我们软件开发中会遇到许多常见的“问题场景”,针对这些问题每个人都有自己程序设计方法,代码质量各有千秋,为了在某些场景下的代码结构,大佬就总结出一些固定的套路来应对这些场景,那么按照大佬的代码套路,开发效率就是杠杠的,也不会出错,大佬总结的套路这个就看作是设计模式。

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

根据具体需求来分析是否使用该设计模式


Java 中单例模式就是借助 Java语法,保证某个类,只能够创建出一个实例化的对象,只能够 new 一次。

单例模式具体的实现方式有很多种,这里博主只讲述两种 “饿汉” 和 “懒汉” 两种。

举个例子形容一下什么叫 “饿汉” 和 “懒汉”:

张三周末放假在家休息,打游戏放松心情,玩着玩着肚子咕咕叫,没错肚子饿了,此时张三给队友发了一条信息:“兄弟们,我肚子饿了,要去吃饭了,拜拜~” ,任由队友如何让 “劝说” ,张三还是放下未打完的游戏就去做饭去了,秉着天大地大,吃饭最大的态度,从容抛弃了队友。

张三此时可以看作是 “饿汉模式”,其中就带有点急迫的意思,有需要就行动


张三周末放假在家休息,打游戏放松心情,玩着玩着肚子咕咕叫,没错肚子饿了,但是有影响吗?没有影响,张三表示跟队友一起玩游戏非常的开心呢,吃饭这种事儿,只要饿不死都不是问题吖,然后继续愉快开黑中,直到玩的手软,没有力气了,此时张三表示,还得是吃饱了才有力气愉快玩耍吖,吃点什么好呢,做饭?不可能做饭的,点外卖吧~

张三此时可以看作是 “懒汉模式”,其中就多了一丝从容,不到最后一刻不行动


二、“饿汉” 实现单例

public class HungryMode {
    // 在类的內部已经实例化好了对象,且是静态的
    private static HungryMode hungryMode = new HungryMode();
    /**
     * 通过静态方法来返回对象的引用
     * 静态方法属于类方法,不依托与对象,使用类名即可调用
     * @return
     */
    static public HungryMode getHungryMode() {
        return hungryMode;
    }
    /*自定义构造方法,使用 private 修饰,类外不得创建对象,创建对象系统对自动调用构造方法
      我们重写了构造方法,系统就调用重写后的构造方法,此时我们 使用 private 修饰构造,
      所以就会造成对象无法实例化成功*/
    private HungryMode() { }
}
class Test {
    public static void main(String[] args) {
        HungryMode hungryMode1 = HungryMode.getHungryMode();
        HungryMode hungryMode2 = HungryMode.getHungryMode();
        System.out.println(hungryMode1.equals(hungryMode2));
    }
}

image.gif

image.gif编辑

该设计模式是多线程安全的。

造成多线程不安全的因素:

不会出现多线程同时对一块内存数据修改的情况,该类只利用方法返回一个实例化对象的引用。

该代码也不会存在内存可见性问题。


三、“懒汉” 实现单例

public class LazybonesMode {
    // volatile 关键字保证内存可见性以及防止指令重排序
    volatile private static LazybonesMode lazybonesMode = null;
    public static LazybonesMode getLazybonesMode() { //非必要不创建实例化对象
        if(lazybonesMode == null) { // 避免重复加锁,只需要 new 一个对象
            synchronized (LazybonesMode.class) { // 加锁保证多线程的情况下实例化对象操纵的原子性
                if(lazybonesMode == null) {
                    lazybonesMode = new LazybonesMode();
                }
            }
        }
        return lazybonesMode;
    }
   /* 使用 private 修饰构造方法,所以就会造成对象无法实例化成功*/
    private LazybonesMode() { };
}
class Test2 {
    public static void main(String[] args) {
        LazybonesMode lazybonesMode1 = LazybonesMode.getLazybonesMode();
        LazybonesMode lazybonesMode2 = LazybonesMode.getLazybonesMode();
        System.out.println(lazybonesMode1 == lazybonesMode2);
    }
}

image.gif

image.gif编辑

image.gif编辑


到这里,Java 单例模式,博主已经分享完了,浅浅的了解一下,希望对大家有所帮助,如有不妥之处欢迎批评指正。

image.gif编辑

本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。

下期预告:Java 线程池

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

相关文章
|
6月前
|
人工智能 安全 搜索推荐
SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
本文深入解析SecMulti-RAG框架,该框架通过整合企业内部知识库、预构建专家知识及受控外部大语言模型,结合保密性过滤机制,解决企业在部署AI助手时面临的信息准确性、数据安全性和成本控制问题。它采用多层策略,利用三种知识来源(动态更新的企业知识、专家预写知识和按需外部知识),并通过微调的开源LLM生成最终响应,确保安全性与性能。实验表明,SecMulti-RAG在汽车行业技术报告生成任务中显著优于传统RAG系统,展现了其在企业环境中的实用性和优势。
202 5
SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
|
11月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
12月前
|
JavaScript 前端开发 Java
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
|
8月前
|
人工智能 JavaScript 程序员
基于 AI 程序员完成新功能开发
基于AI的程序员工具能自动分析并修复编译、调试错误。例如在Vite项目中遇到“ReferenceError: loadEnv is not defined”时,AI可快速定位问题为loadEnv未正确定义或导入,并提供具体解决方案,如检查导入语句、函数定义、配置文件及依赖项版本,帮助开发者高效解决问题。此外,AI还支持一键替换和导入功能,减少代码编写量,提升开发效率。[了解更多](https://blog.csdn.net/qq_41589580/article/details/145779783)
|
6月前
|
数据采集 存储 监控
实时比分更新系统的搭建
这是一套完整的实时比分更新系统方案,涵盖系统架构、扩展功能、部署策略及注意事项。通过数据获取(API与爬虫)、处理(清洗验证)、存储(Redis/MySQL)、服务(RESTful/WebSocket)和展示(Web/移动端)等层次构建,支持推送通知、数据分析和多平台扩展(小程序/Discord)。同时注重数据合法性、性能优化与用户体验,适合从个人到商业级应用。示例代码展示了比赛数据的基本处理逻辑,确保关注与计划状态的准确传递。
|
机器学习/深度学习 算法 Python
BP神经网络算法讲解及实战应用(超详细 附源码)
BP神经网络算法讲解及实战应用(超详细 附源码)
2875 0
|
Java 关系型数据库 MySQL
浪漫编码:手把手教你实现校园表白墙功能
浪漫编码:手把手教你实现校园表白墙功能
226 0
|
数据采集 存储 算法
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
701 0
|
消息中间件 监控 Cloud Native
【阿里云云原生专栏】事件驱动架构在阿里云云原生生态中的角色与实施路径
【5月更文挑战第23天】本文探讨了事件驱动架构在阿里云云原生生态中的关键作用,强调其在微服务协同和应用创新中的效率提升。阿里云提供了EventBridge和EventMesh等服务支持EDA,其中EventBridge作为事件中枢,实现跨平台事件传递,而EventMesh提供高性能事件处理。通过事件模型设计、服务集成、开发处理器和监控优化四个步骤,用户可在阿里云上实施事件驱动架构,构建敏捷响应的云原生应用。随着云原生技术发展,EDA将成为企业数字化转型的重要推动力。
217 0
|
机器学习/深度学习 人工智能 达摩院
阿里达摩院MindOpt优化求解器-月刊(2023年9月)
阿里达摩院MindOpt上线国际站,MindOpt Tuner调参器升级V1.0发布。新增基于AI大模型生成的案例,目标中含有绝对值的建模转换技巧。MindOpt Studio平台支持南方电网的第五届电力调度AI应用大赛。
394 1