Skip to content

工厂模式+策略模式

一、业务场景:多渠道登录

以Gitee登录页面为业务示例,系统支持多种登录方式:

  1. 用户名密码登录(type=account)
  2. 短信验证码登录(type=sms)
  3. 微信登录(type=we_chat)
  4. QQ登录(type=qq) 传统实现会大量嵌套if-else判断登录类型,代码臃肿、新增登录渠道需要修改原有逻辑,违反开闭原则。 采用策略模式封装每种登录逻辑,搭配工厂模式统一生产策略对象,实现分支逻辑解耦。

二、整体执行流程

  1. Service层接收前端传入登录类型type参数;
  2. 将type传入策略工厂;
  3. 工厂读取配置,从Spring容器中匹配对应登录策略实现类;
  4. 工厂对外返回对应策略对象;
  5. 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: qqGranter

4. 策略工厂(工厂模式核心)

工厂内部维护策略池granterPool,启动时读取配置注入所有策略Bean,对外提供根据type获取策略的方法:

java
public class LoginStrategyFactory {
    private Map<String, UserGranter> granterPool;

    public UserGranter getGranter(String grantType) {
        return granterPool.get(grantType);
    }
}

工厂两大核心职责:

  1. 项目启动读取配置,提前加载、缓存所有策略对象;
  2. 根据前端传入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();
    }
}

四、模式结合优势

  1. 消除多层if-else分支,代码结构清晰易读;
  2. 新增登录渠道仅需新增UserGranter实现类、补充配置映射,无需修改原有业务代码,符合开闭原则;
  3. 策略由Spring容器统一管理,单例复用,减少对象创建开销;
  4. 职责拆分明确:策略负责业务逻辑,工厂负责对象分发,Service只处理业务调度。

五、同类拓展业务场景

所有存在冗长if-else/switch多分支判断的业务,均可使用工厂+策略优化:

  1. 订单支付策略:支付宝、微信、银行卡、数字人民币;
  2. 文件解析策略:xls、xlsx、csv格式Excel解析;
  3. 促销折扣策略:满减、打折、优惠券、阶梯优惠;
  4. 物流运费计算:按重量分阶梯计费;
  5. 第三方授权登录:微博、钉钉、GitHub、OSChina。

六、完整总结(面试背诵版)

  1. 策略模式核心是封装多套可互换算法,解决分支判断臃肿问题;工厂模式负责统一管理、分发策略对象,二者搭配是企业主流多分支业务解决方案。
  2. 整体架构三层:抽象策略接口定义统一行为、具体策略实现独立业务逻辑、工厂根据参数匹配返回对应策略。
  3. Spring环境下所有策略实现类交由容器管理,工厂启动加载配置缓存策略Bean,业务层直接通过工厂获取策略执行,完全消除if-else。
  4. 适用场景:登录渠道、支付方式、文件解析、优惠计算等存在大量平行分支算法的业务,新增分支无需改动原有代码,扩展性极强。

七、面试简答

问:说一下工厂模式+策略模式结合的实战场景与实现思路?

答: 最典型场景是多渠道登录功能,系统包含账号、短信、微信、QQ多种登录方式,原生if-else维护困难。 实现思路分为四层:

  1. 定义抽象策略接口统一登录行为;
  2. 每种登录逻辑单独写实现类,用@Component交给Spring管理;
  3. 编写策略工厂,启动读取配置缓存全部策略Bean,对外提供根据type获取策略的方法;
  4. 业务Service注入工厂,传入登录类型直接获取策略执行登录,全程无分支判断。 优势是新增登录渠道只新增策略类,不改动旧代码,符合开闭原则,职责分离、代码易维护。

Powered by VitePress 1.6.4 | 持续更新中