在Java设计模式体系中,工厂模式是创建型模式的经典代表,主要用于对象的创建过程封装,提高系统的灵活性和可维护性。本文将详细解析普通工厂模式、工厂方法模式和抽象工厂模式的核心思想、实现方式及其应用场景,并对比它们之间的异同。
一、普通工厂模式(Simple Factory Pattern)
普通工厂模式,又称简单工厂模式,通过一个工厂类根据传入的参数动态决定创建哪一种产品类的实例。
核心思想:
- 将对象的创建逻辑集中在一个工厂类中
- 客户端无需知道具体产品的类名,只需知道对应的参数
代码结构:`java
// 产品接口
interface Product {
void operation();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("产品A的操作");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("产品B的操作");
}
}
// 简单工厂
class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("未知产品类型");
}
}
}`
优缺点:
- 优点:客户端与具体产品解耦,新增产品时只需修改工厂类
- 缺点:违反开闭原则,新增产品需要修改工厂类代码
二、工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类,将对象的实例化推迟到子类。
核心思想:
- 每个具体产品对应一个具体工厂
- 通过工厂子类来创建具体产品对象
代码结构:`java
// 产品接口
interface Product {
void use();
}
// 具体产品
class ConcreteProduct implements Product {
@Override
public void use() {
System.out.println("使用具体产品");
}
}
// 工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂
class ConcreteFactory implements Factory {
@Override
public Product createProduct() {
return new ConcreteProduct();
}
}`
优缺点:
- 优点:符合开闭原则,新增产品只需添加新的工厂类
- 缺点:类的数量增加,系统复杂度提高
三、抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
核心思想:
- 创建产品族(一组相关产品)
- 每个具体工厂负责创建一族产品
代码结构:`java
// 抽象产品A
interface AbstractProductA {
void operationA();
}
// 抽象产品B
interface AbstractProductB {
void operationB();
}
// 具体产品A1
class ProductA1 implements AbstractProductA {
@Override
public void operationA() {
System.out.println("产品A1操作");
}
}
// 具体产品B1
class ProductB1 implements AbstractProductB {
@Override
public void operationB() {
System.out.println("产品B1操作");
}
}
// 抽象工厂
interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}`
优缺点:
- 优点:保证产品族的一致性,易于交换产品系列
- 缺点:新增产品种类需要修改抽象工厂接口及所有实现类
四、三种工厂模式对比分析
| 对比维度 | 普通工厂模式 | 工厂方法模式 | 抽象工厂模式 |
|---------|------------|------------|------------|
| 核心区别 | 一个工厂创建所有产品 | 一个工厂创建一个产品 | 一个工厂创建一族产品 |
| 开闭原则 | 违反(修改工厂类) | 支持(新增工厂类) | 部分支持(新增产品族) |
| 复杂度 | 简单 | 中等 | 复杂 |
| 适用场景 | 产品类型较少且稳定 | 产品类型可能扩展 | 需要产品族一致性 |
| 灵活性 | 较低 | 较高 | 最高 |
五、实际应用场景
- 普通工厂模式:
- JDK中的Calendar.getInstance()
- 日志框架中的LoggerFactory
- 工厂方法模式:
- 集合框架中的Iterator()方法
- Spring框架中的BeanFactory
- 抽象工厂模式:
- GUI组件库(不同风格的按钮、文本框组合)
- 数据库访问层(不同数据库的连接、命令组合)
六、选择建议
- 当产品类型固定且不会频繁变化时,可使用普通工厂模式
- 当需要系统具有良好的扩展性时,应选择工厂方法模式
- 当需要创建一系列相关产品对象时,应使用抽象工厂模式
###
三种工厂模式体现了面向对象设计的重要原则:封装变化。普通工厂模式将创建逻辑集中,工厂方法模式通过多态实现扩展,抽象工厂模式关注产品族的创建。在实际开发中,应根据具体需求选择合适的设计模式,避免过度设计,在灵活性和简洁性之间找到平衡点。
掌握这些工厂模式不仅能提升代码质量,还能培养良好的设计思维,为构建可维护、可扩展的软件系统奠定坚实基础。