【Java 入门 Day30】 反射 + 设计模式(下篇):单例 + 工厂设计模式,项目落地刚需模板

家人们!反射是框架底层工具,设计模式是前人沉淀的最优代码套路,23 种设计模式里,单例、工厂是面试必考、开发天天写的两款,今天直接给可复制生产代码 + 优缺点对比,看完直接粘贴用!

一、设计模式基础概念

设计模式是无数程序员踩坑总结出来、通用可复用的标准化代码方案,解决各类开发常见场景问题,一共 23 种,分为创建型、结构型、行为型三类。 本篇重点讲解创建型:单例模式、工厂模式

二、单例设计模式:全局只能存在唯一一个对象

核心需求:保证整个 JVM 进程里,某个类有且仅有一个实例 ,比如工具类、数据库连接池、配置管理器、线程池管理器,重复创建会浪费资源。 实现核心:构造方法私有化private 类名(){},杜绝外部 new 实例,仅内部生成唯一对象,对外提供静态方法获取。

方案 1:饿汉式单例(上线项目首选)

java运行

复制代码
class ClassA{
    // 类加载直接初始化唯一实例,static final全局常量
    private static final ClassA ca = new ClassA();
    // 私有构造,禁止外部new
    private ClassA(){}
    // 对外统一获取实例入口
    public static ClassA getInstance(){
        return ca;
    }
}

✅ 优点:类加载直接创建实例,天然线程安全,并发获取效率极高,无同步锁竞争; ❌ 缺点:程序启动直接占用内存,类加载就初始化,全程占用堆空间,空间利用率一般; 适用场景:工具类、全局管理器,不在乎启动少量内存开销。

方案 2:懒汉式同步锁单例(延迟加载,原生有性能短板)

java运行

复制代码
class ClassB{
    // 先不创建,初始为null
    private static ClassB cb;
    // 私有构造
    private ClassB(){}
    // 加synchronized同步锁保证多线程安全
    public synchronized static ClassB getInstance(){
        if(cb == null){
            cb = new ClassB();
        }
        return cb;
    }
}

✅ 优点:懒加载,第一次调用才创建对象,不使用就不占用内存,空间利用率高; ❌ 缺点:方法加全局同步锁,高并发场景大量线程排队等待,执行效率极低; 适用场景:低频调用、无高并发的小工具类。

方案 3:静态内部类单例(最优方案,兼顾性能 + 懒加载)

综合饿汉、懒汉全部优势,企业标准最优写法:

java运行

复制代码
class ClassC{
    private ClassC(){}
    // 静态内部类,外部类加载不会触发内部类初始化
    private static class Inner{
        // 常量单例
        final static ClassC c = new ClassC();
    }
    // 调用时才加载内部类创建实例
    public static ClassC getInstance(){
        return Inner.c;
    }
}

优势汇总:

  1. 懒加载:外部类加载不创建实例,第一次调用getInstance()才初始化;
  2. 天然线程安全:JVM 静态常量加载机制保证单例唯一,不需要加锁,并发性能拉满; 无明显短板,生产环境优先选用这套模板。

三、工厂设计模式:统一管控对象创建逻辑

1. 核心作用

专门解决复杂对象创建问题,把new对象的逻辑全部封装进工厂类,外部业务代码不用关心构造参数、创建细节,统一由工厂产出实例。

2. 和反射的联动

实际开发中工厂搭配反射实现通用工厂,读取配置文件动态生成不同类实例,代码扩展性拉满,Spring Bean 工厂底层就是这套思路。

四、配套工具:Properties 配置文件读取(工厂 + 反射常用)

PropertiesHashtable子类,专门读取.properties配置文件,键值默认全为 String 类型,不用泛型。

核心常用 API

  1. load(输入流):读取配置文件,自动按key=value分割;
  2. getProperty(String key):根据键读取对应字符串值;

业务场景

工厂模式配合 Properties 配置文件,写好类全限定名,反射动态创建对象,不用修改代码就能切换实现类,解耦神器。

整体总结

  1. 反射:运行时解析类信息,动态创建对象、调用私有方法,三大获取 Class 方式,框架底层核心;优缺点分明,业务代码少用,中间件 / 框架必备;
  2. 单例模式三款实现对比:
    • 饿汉:线程安全、并发快、启动占内存;
    • 懒汉同步:懒加载、并发效率差;
    • 静态内部类:行业最优,懒加载 + 无锁高性能;
  3. 工厂模式:封装对象创建逻辑,搭配 Properties 配置 + 反射实现高度通用、可扩展代码;
  4. 开发规范:全局工具类、连接池优先静态内部类单例;框架扩展场景用工厂 + 反射 + 配置文件解耦。