在Spring Boot项目里,工厂模式常被用来封装同一接口不同实现类的创建逻辑,同时结合依赖注入可以让Spring管理实例的生命周期,避免手动new对象带来的耦合问题。下面介绍一种无需复杂配置的简洁实现方案。
核心实现思路
该方案的核心是通过接口定义统一的行为规范,让所有实现类都实现该接口,同时在接口中定义一个标识方法,工厂类通过Spring的ApplicationContext获取所有接口实现类的实例,再根据标识匹配对应的实例返回。
1. 定义统一业务接口
首先创建一个业务接口,内部定义业务方法和类型标识方法,所有实现类都需要实现这两个方法。
// 支付服务接口
public interface PayService {
// 支付业务方法
void pay(double amount);
// 返回支付类型标识
String getType();
}
2. 实现不同的业务子类
针对不同的支付场景,实现上面的接口,每个实现类返回不同的类型标识。
import org.springframework.stereotype.Service;
// 支付宝支付实现
@Service
public class AliPayService implements PayService {
@Override
public void pay(double amount) {
System.out.println("支付宝支付金额:" + amount);
}
@Override
public String getType() {
return "ali";
}
}
// 微信支付实现
@Service
public class WechatPayService implements PayService {
@Override
public void pay(double amount) {
System.out.println("微信支付金额:" + amount);
}
@Override
public String getType() {
return "wechat";
}
}
3. 实现工厂类
工厂类通过构造器注入所有PayService的实现类,在初始化时构建类型到实例的映射,后续根据类型标识直接返回对应实例。
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class PayServiceFactory {
// 存储类型到实例的映射
private final Map<String, PayService> payServiceMap = new HashMap<>();
// 构造器注入所有PayService实现类
public PayServiceFactory(List<PayService> payServiceList) {
for (PayService payService : payServiceList) {
payServiceMap.put(payService.getType(), payService);
}
}
// 根据类型获取对应的支付服务实例
public PayService getPayService(String type) {
PayService payService = payServiceMap.get(type);
if (payService == null) {
throw new IllegalArgumentException("不支持的支付类型:" + type);
}
return payService;
}
}
使用示例
在业务类中注入工厂类,根据传入的类型参数获取对应的服务实例即可调用业务方法。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PayController {
private final PayServiceFactory payServiceFactory;
public PayController(PayServiceFactory payServiceFactory) {
this.payServiceFactory = payServiceFactory;
}
@GetMapping("/pay")
public String pay(@RequestParam String type, @RequestParam double amount) {
PayService payService = payServiceFactory.getPayService(type);
payService.pay(amount);
return "支付成功";
}
}
方案优势
- 无需手动维护实例的创建逻辑,所有实现类由Spring自动管理,新增实现类只需要添加
@Service注解并实现接口即可,工厂类无需修改。 - 避免了传统工厂模式中大量的if-else或者switch判断逻辑,降低代码耦合度。
- 利用Spring的依赖注入特性,实现类的依赖也可以由Spring自动注入,不需要在工厂中手动处理。
注意事项
如果多个实现类返回相同的类型标识,会导致映射覆盖,因此要保证每个实现类的getType方法返回的唯一标识不重复。如果需要支持动态扩展类型,也可以在接口中增加默认类型或者从配置中读取类型标识的逻辑。
Spring_Boot工厂模式依赖注入设计模式修改时间:2026-07-04 07:12:30