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

07. 面向对象高级(2)_设计模式

什么是设计模式

一个问题通常有种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。

设计模式有20多种,对应20多种软件开发中会遇到的问题。

关于设计模式,主要学什么?

解决什么问题?

怎么写?

单例设计模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在某些场景下,我们只需要一个对象来协调系统中的各项操作,例如配置管理、数据库连接池等,单例模式就非常有用。

单例模式写法

饿汉式单例模式的特点

饿汉式单例模式是单例模式的一种实现方式,其特点是在类加载时就创建了唯一的实例。这意味着无论是否需要使用该实例,它都会在类加载时被创建,因此被称为“饿汉式”。

代码实现分析

public class A {
    // 1. 私有化构造器:确保单例类无法创建太多实例,保证单例实现的可能性
    private A(){}

    // 2. 定义一个静态变量:用于存储本类的唯一实例
    private static A a = new A();

    // 3. 提供一个静态方法:用于获取本类的唯一实例
    public static A getA(){
        return a;
    }
}
  • 私有化构造器:private A() {},将构造器私有化,这样外部类就无法通过 new 关键字来创建 A 类的实例,保证了类的实例只能在类内部创建。
  • 静态变量存储唯一实例:private static A a = new A();,在类加载时就创建了 A 类的实例,并将其存储在静态变量 a 中。由于 a 是静态的,所以它属于类而不是类的实例,全局只有一份。
  • 静态方法获取唯一实例:public static A getA() { return a; },提供一个静态方法 getA() 用于获取 A 类的唯一实例。外部类可以通过 A.getA() 来获取该实例。
public class Test {
    public static void main(String[] args) {
        // 目标:掌握单例设计模式的实现方式
        A a1 = A.getA();
        A a2 = A.getA();
        System.out.println(a1 == a2);
        System.out.println(a1);
        System.out.println(a2);
    }
}

测试代码:在 main 方法中,通过 A.getA() 方法分别获取两个 A 类的实例 a1a2,然后比较它们的引用是否相等。由于饿汉式单例模式保证了类只有一个实例,所以 a1a2 的引用是相等的,输出结果为 true

小结

  • 什么是设计模式,设计模式主要学什么?单例模式解决了什么问题?
    • 具体问题的最优解决方案。
    • 解快了什么问题?怎么写?
    • 确保某个类只能创建一个对象。
  • 单例怎么写?饿汉式单例的特点是什么?
    • 把类的构造器私有;定义一个静态变量存储类的一个对象;提供一个静态方法返回对象。
    • 在获取类的对象时,对象已经创建好了。
  • 单例有啥应用场景,有啥好处?
    • 任务管理器对象、获取运行时对象。

懒汉式单例模式

懒汉式单例模式是单例模式的一种实现方式,其特点是在第一次使用该实例时才进行创建,而不是在类加载时就创建。这种方式被称为“懒汉式”,因为它比较“懒”,直到真正需要时才去创建实例。

代码实现分析

  1. 私有化构造器:private B() {},将构造器私有化,防止外部类通过 new 关键字创建 B 类的实例,保证单例的实现。
  2. 静态变量存储实例:private static B b = null;,定义一个静态变量 b 用于存储 B 类的唯一实例,初始值为 null,表示还未创建实例。
  3. 静态方法获取实例:public static B getB(),提供一个静态方法用于获取 B 类的唯一实例。在方法内部,首先检查 b 是否为 null,如果为 null 则创建一个新的 B 类实例并赋值给 b,然后返回 b;如果 b 不为 null,则直接返回 b

测试代码:

main 方法中,通过B.getB()方法分别获取两个 B 类的实例 b1b2,然后比较它们的引用是否相等。由于懒汉式单例模式保证了类只有一个实例,所以 b1b2 的引用是相等的,输出结果为 true

小结

  • 懒汉单例模式的特点是什么?
    • 要用类的对象时才创建对象(延迟加载对象)
  • 懒汉单例模式怎么写?
    • 把构造器私有。
    • 定义一个类变量用于存储对象。
    • 提供一个类方法,保证返回的是同一个对象。

相关文章:

  • 基于ssm的在线点歌系统(全套)
  • 电源电路篇
  • python:AI+ music21 构建LSTM模型生成爵士风格音乐
  • Liunx安装elasaticsearch、ik分词器、kibana
  • 批处理文件:用gifsicle删除gif文件中的奇数帧
  • 【快递分拣员-Git介绍】
  • elsticsearch 通过reindex修改shards
  • 使用crash解析vmcore(fulldump)文件,基于qemu,arm64,linux6.6
  • 社区医疗管理系统基于Spring Boot SSM
  • Trae如何使用插件Mybatis Log MybatisX转换SQL语句?
  • 分裂层次聚类算法:从原理到实战的全方位解析
  • Java-模块一
  • Controller/RestController的区别
  • 支持多个和可选参数
  • 【WPF】c#读取CAD的dxf文件,并基于Canvas将读取到的数据重新描绘到界面
  • Unity URP 实现场景和UI添加后处理
  • Java 反射详细教程
  • 数据可视化(matplotlib)-------辅助图标的设置
  • 早餐 3.20
  • 笔记:代码随想录算法训练营day57:99.岛屿数量 深搜、岛屿数量 广搜、100.岛屿的最大面积
  • 李洋谈美国黑帮电影与黑帮文化
  • 倒票“黄牛”屡禁不绝怎么破?业内:强化文旅市场票务公开制度
  • 时隔3年,持续近2小时,俄乌在土耳其谈成了什么?
  • 梅花奖在上海|湘剧《夫人如见》竞梅,长沙文旅来沪推广
  • 上海比常年平均时间提前12天入夏,明天最高气温可达33℃
  • 混乱的5天:俄乌和谈如何从充满希望走向“卡壳”