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

发布于:2025-03-21 ⋅ 阅读:(18) ⋅ 点赞:(0)

什么是设计模式

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

设计模式有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

小结

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