当前位置: 首页 > news >正文

【Java SE】单例设计模式

参考笔记:深入理解Java设计模式:单例模式及其饿汉式与懒汉式的对比,-CSDN博客

目录

1.什么是设计模式

2.经典设计模式

3.单例设计模式(static属性/方法经典使用场景 )

3.1 饿汉式单例模式

3.2 懒汉式单例模式

4.补充


1.什么是设计模式

设计模式是在大量的实践中总结和理论化之后优的代码结构、编程风格、以及解决问题的思考方式

2.经典设计模式

经典的设计模式共 23 种 

① 创建型模式,共 5 种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

② 结构性模式,共 7 种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

③ 行为型模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式


3.单例设计模式(static属性/方法经典使用场景 )

单例设计模式:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

单例设计模式主要有以下三个特点:

① 只能有一个实例
② 必须自己创建自己的唯一实例  
③ 必须给所有其他对象提供这一实例

3.1 饿汉式单例模式

① 特点:立即加载,类加载时就会把 single 创建完毕

② 优点:实现简单,不会有多线程安全问题

③ 缺点:当类加载时,会初始化 static 变量,静态变量被创建并分配内存空间。从这以后,这个 sttaic 的实例便一直占着这块内存,直到类被卸载时,静态变量被销毁,并解释所占用的内存空间。因此饿汉式单例模式在特定条件下会耗费内存

public class Test {
    public static void main(String[] args) {
        Singleton single1 = Singleton.getInstance();
        Singleton single2 = Singleton.getInstance();
        System.out.println(single1==single2);//true
        System.out.println(single1);
        System.out.println(single2);
    }
}

//饿汉式单例模式
class Singleton {

    private String name;


    // 1.私有化构造器,防止直接在其他类new对象
    private Singleton(String name) {
        this.name = name;
    }

    // 2.内部提供一个当前类的实例
    // 4.为了能够在静态方法getInstance中返回变量,single也必须静态化(静态方法只能调用静态属性/方法)
    private static Singleton single = new Singleton("小马");

    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
        return single;
    }

    @Override
    public String toString() {
        return "Singleton{" +
                "name='" + name + '\'' +
                '}';
    }
}

3.2 懒汉式单例模式

先看代码,后面再总结

public class Test {
    public static void main(String[] args) {

        //single1和single2是同一对象
        Singleton single1 = Singleton.getInstance();
        Singleton single2 = Singleton.getInstance();
        System.out.println(single1==single2);//true
        System.out.println(single1);
        System.out.println(single2);
    }
}

//懒汉式单例模式
class Singleton {
    // 1.私有化构造器
    private Singleton() {
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single;
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
        if(single == null) {
            single = new Singleton();
        }
        return single;
    }
}
/*输出结果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/

① 特点:延迟加载,只有在调用静态方法 getInstancesingle 才被分配内存空间

② 优点:实现简单

    (1)饿汉式在类加载时就创建了对象实例,但是可能这个对象后面没有用或者用的少,就造成浪费;

    (2)懒汉式在类加载时 static 实例未被创建和分配内存空间,只有当静态方法 getInstance 第一次被调用时才返回对象,再次调用时,返回的也是上次调用的对象,因此保证了仅一个实例对象

③ 缺点:在多线程环境中,该实现方法存在线程安全问题,不能保证单例的唯一性

说明: 3 个线程同时进入 if 语句中,new3 次,破环了单例设计模式的原则 

4.补充

JavaSE 类库中,java.lang.Runtime 就是经典的单例模式,且是饿汉式的 

相关文章:

  • TNNLS 2024 | 基于残差超密集网络的高光谱图像空间光谱融合方法
  • 【Java基础】在Java中,一个线程的大小(即线程所占用的内存)是多少
  • 关于FastAPI框架的面试题及答案解析
  • 如何在 Flutter 中使用 WebRTC
  • 从零开始学3PC:分布式事务的进阶方案
  • HarmonyOS第23天:应用性能优化,解锁流畅体验密码
  • 当下主流 AI 模型对比:ChatGPT、DeepSeek、Grok 及其他前沿技术
  • 51单片机笔记
  • 【Leetcode 每日一题】2680. 最大或值
  • 组合总和
  • 理解 Node.js 中的 process`对象与常用操作
  • 系统思考—链接组织效能提升与问题解决
  • VideoHelper 油猴脚本,重塑你的视频观看体验
  • 51c~C++合集1
  • 【CSS文字渐变动画】
  • 无人机点对点技术要点分析!
  • xwiki自定义认证实现单点登录
  • XSS介绍通关XSS-Labs靶场
  • 分页优化之——游标分页
  • IREE 内存分配算法概述
  • 上海:5月8日起5年以上首套个人住房公积金贷款利率下调至2.6%
  • 韩正出席庆祝中国欧盟建交50周年招待会并致辞
  • 今天全国铁路、公路进入返程高峰,这些路段时段通行压力大
  • 研究完蚂蚁搬家,我好像明白了为什么我们总是堵车
  • 李在明回应韩国大法院判决:与自己所想截然不同,将顺从民意
  • 大学2025丨对话深大人工智能学院负责人李坚强:产学研生态比“造天才”更重要