**一、工厂模式(Factory Pattern)**
核心思想 :封装对象创建逻辑,解耦客户端与具体类
适用场景:需要动态创建多种类型对象,避免在客户端代码中硬编码具体类。
**1. 简单工厂模式(Simple Factory)**
-
结构 :
- 产品接口(
Product
) - 具体产品类(
ConcreteProductA
/ConcreteProductB
) - 工厂类(
SimpleFactory
)根据参数创建对象
- 产品接口(
-
代码示例 :
interface Product { void use(); } class ProductA implements Product { public void use() { System.out.println("使用产品A"); } } class ProductB implements Product { public void use() { System.out.println("使用产品B"); } } class SimpleFactory { public static Product createProduct(String type) { if ("A".equals(type)) return new ProductA(); else if ("B".equals(type)) return new ProductB(); throw new IllegalArgumentException("无效类型"); } } // 客户端调用 Product product = SimpleFactory.createProduct("A"); product.use(); // 输出:使用产品A
-
缺点:新增产品需修改工厂类,违反开闭原则。
**2. 工厂方法模式(Factory Method)**
-
结构 :
- 抽象工厂接口(
Factory
) - 具体工厂子类(
FactoryA
/FactoryB
)负责创建特定产品
- 抽象工厂接口(
-
代码示例 :
interface Factory { Product createProduct(); } class FactoryA implements Factory { @Override public Product createProduct() { return new ProductA(); } } // 客户端调用 Factory factory = new FactoryA(); Product product = factory.createProduct();
-
优势:新增产品时只需扩展新工厂类,符合开闭原则。
**二、抽象工厂模式(Abstract Factory Pattern)**
核心思想 :创建相关产品族 (多个产品等级),强调产品间的约束关系
适用场景:需要构建跨平台/跨风格的整套产品(如UI组件库、数据库连接套件)。
1. 核心结构
角色 | 职责 |
---|---|
抽象工厂(AbstractFactory ) |
声明创建产品族的方法(如createButton() ) |
具体工厂(ConcreteFactory ) |
实现具体产品族的创建(如WindowsFactory ) |
抽象产品(AbstractProduct ) |
定义产品接口(如Button /TextField ) |
具体产品(ConcreteProduct ) |
实现平台相关逻辑(如WindowsButton ) |
**2. 代码示例(跨平台UI组件)**
// 抽象产品
interface Button { void paint(); }
interface TextField { void render(); }
// 具体产品(Windows风格)
class WindowsButton implements Button {
@Override public void paint() { System.out.println("Windows风格按钮"); }
}
class WindowsTextField implements TextField {
@Override public void render() { System.out.println("Windows风格文本框"); }
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂(Windows产品族)
class WindowsFactory implements GUIFactory {
@Override public Button createButton() { return new WindowsButton(); }
@Override public TextField createTextField() { return new WindowsTextField(); }
}
// 客户端调用
GUIFactory factory = new WindowsFactory();
Button button = factory.createButton();
button.paint(); // 输出:Windows风格按钮
3. 优势与局限
- 优势 :
- 保证产品族兼容性(如所有Windows组件风格一致)
- 客户端代码与具体平台解耦
- 局限 :新增产品等级(如新增
Checkbox
)需修改所有工厂接口 。
三、工厂模式 vs 抽象工厂模式对比
维度 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|
核心目标 | 创建单一产品 | 创建产品族(多个相关产品) |
产品复杂度 | 单产品等级 | 多产品等级(如按钮+文本框) |
扩展方向 | 扩展新产品(纵向) | 扩展新产品族(横向) |
典型应用 | Spring的BeanFactory |
JDBC的DriverManager |
四、演进关系与选择建议
- 演进路线 :
简单工厂 → 工厂方法 → 抽象工厂
(复杂度递增) - 选型建议 :
- 单一产品变化 → 工厂方法(如日志记录器)
- 多产品组合约束 → 抽象工厂(如跨平台UI、数据库适配器)
- 避免滥用:简单场景直接
new
更高效 。