主题切换
工厂模式+策略模式
一、业务场景:多渠道登录
以Gitee登录页面为业务示例,系统支持多种登录方式:
- 用户名密码登录(type=account)
- 短信验证码登录(type=sms)
- 微信登录(type=we_chat)
- QQ登录(type=qq) 传统实现会大量嵌套if-else判断登录类型,代码臃肿、新增登录渠道需要修改原有逻辑,违反开闭原则。 采用策略模式封装每种登录逻辑,搭配工厂模式统一生产策略对象,实现分支逻辑解耦。
二、整体执行流程
- Service层接收前端传入登录类型type参数;
- 将type传入策略工厂;
- 工厂读取配置,从Spring容器中匹配对应登录策略实现类;
- 工厂对外返回对应策略对象;
- Service调用策略对象的登录方法,完成登录校验。
三、分层结构与代码说明
1. 抽象策略层
定义统一登录接口UserGranter,规范所有登录方式必须实现的登录方法,对应策略模式的抽象策略角色。
java
public interface UserGranter {
// 统一登录方法
void login();
}2. 具体策略实现(Spring托管)
每种登录方式单独创建实现类,添加@Component交给Spring容器管理,对应策略模式具体策略角色:
- AccountGranter:账号密码登录实现
- SmsGranter:短信验证码登录实现
- WeChatGranter:微信第三方登录实现
- QqGranter:QQ第三方登录实现 示例代码:
java
@Component
public class AccountGranter implements UserGranter{
@Override
public void login() {
// 账号密码专属登录逻辑
}
}3. 配置映射关系
通过配置文件维护type与策略Bean的映射:
yaml
login:
types:
account: accountGranter
sms: smsGranter
we_chat: weChatGranter
qq: qqGranter4. 策略工厂(工厂模式核心)
工厂内部维护策略池granterPool,启动时读取配置注入所有策略Bean,对外提供根据type获取策略的方法:
java
public class LoginStrategyFactory {
private Map<String, UserGranter> granterPool;
public UserGranter getGranter(String grantType) {
return granterPool.get(grantType);
}
}工厂两大核心职责:
- 项目启动读取配置,提前加载、缓存所有策略对象;
- 根据前端传入type参数,匹配并返回对应登录策略。
5. Service业务层
仅依赖工厂,不再写if-else,直接传入type获取策略执行登录:
java
@Service
public class LoginService {
@Autowired
private LoginStrategyFactory factory;
public void login(String type) {
UserGranter granter = factory.getGranter(type);
granter.login();
}
}四、模式结合优势
- 消除多层if-else分支,代码结构清晰易读;
- 新增登录渠道仅需新增
UserGranter实现类、补充配置映射,无需修改原有业务代码,符合开闭原则; - 策略由Spring容器统一管理,单例复用,减少对象创建开销;
- 职责拆分明确:策略负责业务逻辑,工厂负责对象分发,Service只处理业务调度。
五、同类拓展业务场景
所有存在冗长if-else/switch多分支判断的业务,均可使用工厂+策略优化:
- 订单支付策略:支付宝、微信、银行卡、数字人民币;
- 文件解析策略:xls、xlsx、csv格式Excel解析;
- 促销折扣策略:满减、打折、优惠券、阶梯优惠;
- 物流运费计算:按重量分阶梯计费;
- 第三方授权登录:微博、钉钉、GitHub、OSChina。
六、完整总结(面试背诵版)
- 策略模式核心是封装多套可互换算法,解决分支判断臃肿问题;工厂模式负责统一管理、分发策略对象,二者搭配是企业主流多分支业务解决方案。
- 整体架构三层:抽象策略接口定义统一行为、具体策略实现独立业务逻辑、工厂根据参数匹配返回对应策略。
- Spring环境下所有策略实现类交由容器管理,工厂启动加载配置缓存策略Bean,业务层直接通过工厂获取策略执行,完全消除if-else。
- 适用场景:登录渠道、支付方式、文件解析、优惠计算等存在大量平行分支算法的业务,新增分支无需改动原有代码,扩展性极强。
七、面试简答
问:说一下工厂模式+策略模式结合的实战场景与实现思路?
答: 最典型场景是多渠道登录功能,系统包含账号、短信、微信、QQ多种登录方式,原生if-else维护困难。 实现思路分为四层:
- 定义抽象策略接口统一登录行为;
- 每种登录逻辑单独写实现类,用@Component交给Spring管理;
- 编写策略工厂,启动读取配置缓存全部策略Bean,对外提供根据type获取策略的方法;
- 业务Service注入工厂,传入登录类型直接获取策略执行登录,全程无分支判断。 优势是新增登录渠道只新增策略类,不改动旧代码,符合开闭原则,职责分离、代码易维护。