创建型-抽象工厂模式
2026/1/15大约 3 分钟Java设计模式创建型模式工厂模式Java设计模式面向对象架构设计最佳实践代码优化
概述
抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用场景
- 系统需要独立于产品的创建、组合和表示
- 系统需要配置多个产品系列中的一个
- 需要强调一系列相关产品对象的设计以便联合使用
- 提供一个产品类库,只想显示接口而非实现
角色组成
- AbstractFactory(抽象工厂):声明创建产品的方法
- ConcreteFactory(具体工厂):实现创建具体产品的方法
- AbstractProduct(抽象产品):声明产品接口
- ConcreteProduct(具体产品):实现产品接口
代码实现
1. 抽象产品
// 按钮产品
public interface Button {
void render();
}
// 文本框产品
public interface TextField {
void render();
}2. 具体产品(Windows风格)
public class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染 Windows 风格按钮");
}
}
public class WindowsTextField implements TextField {
@Override
public void render() {
System.out.println("渲染 Windows 风格文本框");
}
}3. 具体产品(Mac风格)
public class MacButton implements Button {
@Override
public void render() {
System.out.println("渲染 Mac 风格按钮");
}
}
public class MacTextField implements TextField {
@Override
public void render() {
System.out.println("渲染 Mac 风格文本框");
}
}4. 抽象工厂
public interface GUIFactory {
Button createButton();
TextField createTextField();
}5. 具体工厂
public class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
public class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}6. 客户端
public class Application {
private Button button;
private TextField textField;
public Application(GUIFactory factory) {
button = factory.createButton();
textField = factory.createTextField();
}
public void render() {
button.render();
textField.render();
}
public static void main(String[] args) {
// 根据配置选择工厂
String os = System.getProperty("os.name").toLowerCase();
GUIFactory factory;
if (os.contains("windows")) {
factory = new WindowsFactory();
} else {
factory = new MacFactory();
}
Application app = new Application(factory);
app.render();
}
}类图
实际案例:数据库访问
// 抽象产品
public interface Connection {
void connect();
}
public interface Command {
void execute(String sql);
}
// MySQL 产品
public class MySQLConnection implements Connection {
@Override
public void connect() {
System.out.println("连接 MySQL 数据库");
}
}
public class MySQLCommand implements Command {
@Override
public void execute(String sql) {
System.out.println("MySQL 执行: " + sql);
}
}
// Oracle 产品
public class OracleConnection implements Connection {
@Override
public void connect() {
System.out.println("连接 Oracle 数据库");
}
}
public class OracleCommand implements Command {
@Override
public void execute(String sql) {
System.out.println("Oracle 执行: " + sql);
}
}
// 抽象工厂
public interface DatabaseFactory {
Connection createConnection();
Command createCommand();
}
// 具体工厂
public class MySQLFactory implements DatabaseFactory {
@Override
public Connection createConnection() {
return new MySQLConnection();
}
@Override
public Command createCommand() {
return new MySQLCommand();
}
}JDK 中的应用
javax.xml.parsers.DocumentBuilderFactoryjavax.xml.transform.TransformerFactoryjavax.xml.xpath.XPathFactory
优缺点
优点:
- 分离了具体的类
- 易于交换产品系列
- 有利于产品的一致性
缺点:
- 难以支持新种类的产品
- 增加新产品需要修改抽象工厂接口
工厂模式对比
| 模式 | 产品数量 | 工厂数量 | 适用场景 |
|---|---|---|---|
| 简单工厂 | 多个 | 1个 | 产品较少 |
| 工厂方法 | 1个 | 多个 | 单一产品族 |
| 抽象工厂 | 多个 | 多个 | 多个产品族 |
