抽象工厂模式通过定义dbfactory接口及各数据库具体工厂实现,将数据库对象创建逻辑集中封装,业务代码仅依赖抽象接口,支持配置化切换与运行时动态切库,新增数据库只需扩展工厂类且零侵入现有逻辑。

用抽象工厂模式重构多数据库驱动切换,核心是把“创建什么库的对象”这件事从业务代码里拎出来,变成可配置、可替换的工厂行为。不是硬编码 new MySQLConnection(),而是让工厂根据当前环境决定造哪个。
明确抽象层:定义统一接口族
数据库操作离不开连接、语句、事务等协作对象,它们之间有强依赖关系。抽象工厂要管的不是单个类,而是一整套配套实现:
- 定义 DBFactory 接口,声明
createConnection()、createStatement()、createTransaction()等方法 - 每个具体数据库(MySQL、Oracle、PostgreSQL)各自实现一套完整对象:比如 MySqlFactory 返回 MySqlConnection + MySqlStatement,OracleFactory 返回配套的 Oracle 实现
- 所有具体类都只依赖接口,不暴露驱动细节(如 Oracle 的
setAutoCommit(false)封装在 OracleTransaction 内部)
解耦业务层:用工厂实例代替具体构造
业务代码不再感知数据库类型,只面向抽象工厂和产品接口工作:
- Service 类持有一个 DBFactory 引用,而非一堆 new 出来的 Connection 或 Statement
- 执行查询时调用
factory.createConnection().connect()→factory.createStatement().execute("SELECT..."),全程不出现 "MySQL" 或 "Oracle" 字样 - 切换数据库只需替换工厂实例:启动时读配置
db.type=oracle,然后dbFactory = new OracleFactory()
支持运行时动态切换:配合策略或上下文
静态替换工厂虽解耦,但不够灵活。要支持运行时切库,可以加一层间接:
- 引入 DBFactoryContext 类,内部维护一个 ThreadLocal
或 Map - 提供
use(String dbType)方法,根据类型名查找并绑定对应工厂(如 "mysql" → MySqlFactory) - 业务方法开头调用
DBFactoryContext.use("slave"),后续所有 factory 调用自动走从上下文取出的实例 - 结合 AOP,在方法入口解析自定义注解
@UseDB("master"),自动触发上下文切换
扩展新数据库:零侵入添加
新增 PostgreSQL 支持时,完全不用动已有业务或工厂调度逻辑:
- 写 PostgreFactory 实现 DBFactory 接口,提供 PostgreConnection、PostgreStatement 等
- 在工厂上下文注册映射:
context.register("postgresql", new PostgreFactory()) - 配置文件或参数传入
db.type=postgresql,其余流程自动适配 - 各实现类独立测试,互不影响;升级 MySQL 驱动也只改 MySqlFactory,不影响 Oracle 流程
不复杂但容易忽略:抽象工厂的价值不在多写几个类,而在于把“用哪个库”这个变化点锁死在工厂创建环节,让业务逻辑真正稳定下来。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











