我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与学习心得,希望用通俗易懂的方式帮助开发者快速掌握核心技术。持续输出AI、云计算及开源技术相关内容
在软件开发中,对象的创建是一个常见但复杂的问题。当系统需要根据不同的条件创建不同类型的对象时,直接使用new
操作符会导致代码高度耦合,难以维护和扩展。工厂方法模式(Factory Method Pattern)正是为解决这类对象创建问题而生的设计模式。
根据《设计模式:可复用面向对象软件的基础》(GoF)统计,工厂方法模式在框架设计中的使用率高达45%,是最常用的创建型模式之一。在Spring、Hibernate等主流框架中,工厂方法模式被广泛应用来实现灵活的组件创建机制。
工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。其核心特点包括:
图1:工厂方法模式类图
工厂方法模式通过将对象的创建过程抽象化,实现了:
图2:工厂方法模式时序图
// 产品接口
public interface Product {
void operation();
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 抽象工厂
public abstract class Creator {
public abstract Product factoryMethod();
public void someOperation() {
Product product = factoryMethod();
product.operation();
}
}
// 具体工厂A
public class ConcreteCreatorA extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具体工厂B
public class ConcreteCreatorB extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreatorA();
creator.someOperation();
creator = new ConcreteCreatorB();
creator.someOperation();
}
}
public abstract class Creator {
public abstract Product factoryMethod(String type);
}
public class ConcreteCreator extends Creator {
@Override
public Product factoryMethod(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("Unknown product type");
}
}
}
public class GenericCreator {
public static <T extends Product> T createProduct(Class<T> clazz) {
try {
return clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException("Failed to create product", e);
}
}
}
// 使用方式
Product product = GenericCreator.createProduct(ConcreteProductA.class);
工厂方法模式适用于以下场景:
图3:应用场景分布占比图
图4:使用频率占比图
图5:应用特征雷达图
图6:发展趋势图
List<String> list = List.of("a", "b", "c"); // Java 9+ 工厂方法
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("a", 1, "b", 2);
public interface BeanFactory {
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
// 其他工厂方法...
}
// 具体实现类
public class DefaultListableBeanFactory implements BeanFactory {
// 实现工厂方法
}
Connection conn = DriverManager.getConnection(url, user, password);
// SLF4J示例
Logger logger = LoggerFactory.getLogger(MyClass.class);
图4:工厂方法模式优缺点分析图
对比项 | 工厂方法模式 | 简单工厂模式 |
---|---|---|
结构复杂度 | 较高 | 较低 |
扩展性 | 好(OCP原则) | 差(需修改工厂类) |
灵活性 | 高 | 低 |
适用场景 | 复杂对象创建 | 简单对象创建 |
类数量 | 较多 | 较少 |
对比项 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|
创建对象 | 单一产品 | 产品族 |
方法数量 | 一个工厂方法 | 多个工厂方法 |
层次结构 | 单层抽象 | 双层抽象 |
扩展方向 | 垂直扩展(新产品) | 水平扩展(新产品族) |
复杂度 | 较低 | 较高 |
工厂方法模式是一种强大而灵活的设计模式,它通过将对象的创建过程抽象化,实现了:
在实际开发中,我们应该根据具体场景选择合适的工厂实现方式。对于简单场景,可以考虑简单工厂;对于复杂场景,工厂方法模式或抽象工厂模式可能更合适。随着现代框架的发展,工厂方法模式常与依赖注入、IoC容器等技术结合使用,发挥更大的威力。
权威参考: