知识点一:抽象工厂模式 (Abstract Factory Pattern)
-
核心概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
-
详细解释:
-
普通工厂模式只生产单一产品,而"抽象工厂"生产的是**"产品族"**。在真实业务中,产品往往是配套使用的(比如 MySQL 的连接对象必须配合 MySQL 的语句对象使用)。
-
它包含四个角色:
-
抽象产品 (Abstract Product):定义产品的公共接口(如
DBConnection、DBStatement)。 -
具体产品 (Concrete Product):实现接口的具体类(如
MySQLConnection、OracleStatement)。 -
抽象工厂 (Abstract Factory):声明创建产品族的方法(如
DBFactory接口里的createConnection()和createStatement())。 -
具体工厂 (Concrete Factory):实现抽象工厂,负责生产一组具体的产品(如
MySQLFactory生产 MySQL 的那一套)。
-
-
-
本实验代码对应 :
DBFactory就是抽象工厂,MySQLFactory和OracleFactory是具体工厂,它们保证了客户端拿到的 Connection 和 Statement 一定是属于同一个数据库体系的产品,不会出现"MySQL的Connection搭配Oracle的Statement"的乱象。 -
作用:完美解决"一系列相互依赖对象"的创建问题,保证产品族的内部一致性,方便整体替换。
知识点二:Java 反射机制 (Java Reflection)
-
核心概念 :在程序的运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种"动态获取信息以及动态调用对象方法"的功能称为反射。
-
详细解释:
-
传统创建对象的方式是
new MySQLFactory(),这叫"静态编译期绑定"。 -
反射则是通过字符串(类的完全限定名)来加载类。核心API是
Class.forName("类的全限定名")。JVM 会根据这个字符串去硬盘上寻找对应的.class文件,并将其加载到内存中,然后可以通过newInstance()或其变体实例化对象。
-
-
本实验代码对应 :
DBManager.getFactory(String factoryClassName)中的Class.forName(factoryClassName).getDeclaredConstructor().newInstance()。即使你的代码里没有写过new MySQLFactory(),只要传入了"com.abc.homework1.MySQLFactory"这个字符串,程序依然能在运行时把它造出来。 -
作用:极大提高了程序的灵活性和扩展性。它是所有现代 Java 框架(如 Spring、MyBatis)的底层基石,也是真实 JDBC 驱动加载的原理。
知识点三:面向接口编程与多态 (Interface-Oriented Programming & Polymorphism)
-
核心概念:"面向接口编程"要求我们在声明变量、方法参数返回值时,尽量使用抽象类型(接口或父类),而不是具体实现类。而"多态"是指同一个接口,使用不同的实例而执行不同操作。
-
详细解释:
-
不要写成
MySQLConnection conn = new MySQLConnection();,而是写成DBConnection conn = new MySQLConnection();(左边是接口,右边是实现)。 -
当调用
conn.connect()时,Java 会根据运行时右侧的实际对象(MySQL还是Oracle),动态绑定去执行对应的方法。这叫"向上转型"。
-
-
本实验代码对应 :在
Test1.java中:DBConnection conn = factory.createConnection();这行代码。你在写这行代码时,根本不知道也不关心factory是个什么数据库,但程序运行起来后,多态机制会让它自动调用正确的方法。 -
作用:极大地降低了代码的耦合度。屏蔽了底层实现的差异,让上层业务代码更加稳定。
知识点四:开闭原则 (Open-Closed Principle, OCP)
-
核心概念 :软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这是面向对象设计的终极目标之一。
-
详细解释:
-
对扩展开放:当系统增加新功能时,可以通过新增代码来实现。
-
对修改关闭:当系统增加新功能时,尽量不修改原有的代码,防止改出 Bug。
-
-
本实验代码对应 :如果你的作业要求新增一个
SQL Server数据库支持。你完全不需要修改Test1、DBManager、DBFactory的代码。你只需要新写SQLServerConnection、SQLServerStatement和SQLServerFactory三个类,然后在Test1里把字符串改成"com.abc.homework1.SQLServerFactory"即可。这就是开闭原则的完美体现。 -
作用:保证软件的稳定性和可维护性,延长软件的生命周期。
知识点五:JDBC 真实驱动加载原理 (JDBC SPI Mechanism)
-
核心概念:JDBC(Java DataBase Connectivity)是 Java 官方提供的一套接口。各个数据库厂商(MySQL、Oracle)负责提供具体的实现(即 Jar 包,俗称驱动)。
-
详细解释:
-
真实开发中,你写
Class.forName("com.mysql.cj.jdbc.Driver");,这行代码利用反射把 MySQL 的驱动类加载进内存。 -
这个驱动类里包含了一个静态代码块,一加载就会向
DriverManager注册自己。 -
之后你调用
DriverManager.getConnection(...),它就会把你传入的 URL(比如jdbc:mysql://...)交给对应的驱动去建立真实连接。
-
-
本实验对应 :你的实验是用纯 Java 面向对象和设计模式模拟了这个过程。你的
DBManager扮演了类似DriverManager的角色,你的Factory和具体类则模拟了各个数据库厂商的驱动包和内部实现。 -
作用:理解了这个知识点,你就明白了为什么 Java 跨平台、跨数据库这么强------因为底层都在依赖同一套接口规范和反射机制。
知识点六:工程构建的版本一致性 (Java Build Environment Consistency)
-
核心概念:Java 项目的"源码级别(Source)"、"目标字节码版本(Target)"和"运行环境(SDK/JDK)"必须保持高度一致。
-
详细解释:
-
你在做这个实验时经历的报错
Cannot compile module ... target 17: fallback SDK version 8...,就是典型的版本冲突。 -
pom.xml中的 Maven 配置代表着告诉 Maven 用什么标准去编译;IDEA 的Project Structure中的 SDK 决定用什么库去编译;而Java Compiler中的Target bytecode version决定了最终生成什么版本的.class文件给 JVM 运行。 -
只要其中任何一个环节(比如 Maven 配置成了 25/17,但环境是 1.8)不匹配,编译器就会罢工。
-
-
本实验对应 :你自己动手修改了
pom.xml的<maven.compiler.source>1.8</...>,并在 Project Structure 和 Settings 中全面对齐了 JDK 1.8。 -
作用:这是企业级项目开发最基本的工程能力。理解版本一致性能让你在以后的开发中避免无数个令人抓狂的"莫名其妙"的编译错误。