跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

工厂模式与策略模式结合的最佳实践

综述由AI生成工厂模式与策略模式的结合应用。通过定义题目类型枚举、策略接口及具体实现类,利用反射机制构建策略工厂,根据题目类型动态获取并执行对应的处理逻辑。代码示例展示了单选题、多选题、判断题和简答题的处理流程,实现了业务逻辑的解耦与扩展。

战神发布于 2026/3/30更新于 2026/5/2329 浏览
工厂模式与策略模式结合的最佳实践

工厂模式与策略模式结合的最佳实践

1. 目录结构

(此处省略目录结构图)

2. SubjectType.java 策略枚举类

package com.sunxiansheng.design_pattern.factory_strategy.strategyenum;

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Description: 题目类型,分为单选、多选、判断、简答
 */
public enum SubjectType {
    // 单选题
    SINGLE_CHOICE(1, "单选题"),
    // 多选题
    MULTIPLE_CHOICE(2, "多选题"),
    // 判断题
    JUDGMENT(3, "判断题"),
    // 简答题
    SHORT_ANSWER(4, "简答题");

    private int code;
    private String desc;

    SubjectType(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    // 将枚举转为 map
    public static Map<Integer, SubjectType> enumeratedMaps = Stream.of(SubjectType.values())
            .collect(Collectors.toMap(SubjectType::getCode, Function.identity()));

    /**
     * 根据 code 获取题目类型
     *
     * @param code
     * @return
     */
    public static SubjectType getSubjectType(int code) {
        return enumeratedMaps.get(code);
    }
}

3. ISubjectStrategy.java 策略接口

package com.sunxiansheng.design_pattern.factory_strategy.strategy;

import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 题目策略
 */
public interface ISubjectStrategy {
    /**
     * 获取题目类型
     *
     * @return
     */
    SubjectType getSubjectType();

    /**
     * 处理题目
     */
    void handleQuestion();
}

4. 策略接口实现类

1. Judgment.java

package com.sunxiansheng.design_pattern.factory_strategy.strategy;

import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 判断题策略
 */
public class Judgment implements ISubjectStrategy {
    @Override
    public void handleQuestion() {
        System.out.println("处理判断题");
    }

    @Override
    public SubjectType getSubjectType() {
        return SubjectType.JUDGMENT;
    }
}

2. MultipleChoice.java

package com.sunxiansheng.design_pattern.factory_strategy.strategy;

import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 多选题策略
 */
public class MultipleChoice implements ISubjectStrategy {
    @Override
    public void handleQuestion() {
        System.out.println("处理多选题");
    }

    @Override
    public SubjectType getSubjectType() {
        return SubjectType.MULTIPLE_CHOICE;
    }
}

3. ShortAnswer.java

package com.sunxiansheng.design_pattern.factory_strategy.strategy;

import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 简答题策略
 */
public class ShortAnswer implements ISubjectStrategy {
    @Override
    public void handleQuestion() {
        System.out.println("处理简答题");
    }

    @Override
    public SubjectType getSubjectType() {
        return SubjectType.SHORT_ANSWER;
    }
}

4. SingleChoice.java

package com.sunxiansheng.design_pattern.factory_strategy.strategy;

import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 单选题策略
 */
public class SingleChoice implements ISubjectStrategy {
    @Override
    public void handleQuestion() {
        System.out.println("处理单选题");
    }

    @Override
    public SubjectType getSubjectType() {
        return SubjectType.SINGLE_CHOICE;
    }
}

5. Strategy.java 策略工厂

package com.sunxiansheng.design_pattern.factory_strategy.factory;

import com.sunxiansheng.design_pattern.factory_strategy.strategy.ISubjectStrategy;
import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Description: 策略工厂
 */
public class Strategy {
    /**
     * 正常情况下是使用 Spring 的依赖注入,这里直接使用反射模拟了
     */
    private List<ISubjectStrategy> strategies = new ArrayList<>();

    /**
     * 策略 map,将 list 转为 map,方便根据题目类型获取策略
     */
    private Map<SubjectType, ISubjectStrategy> strategyMap = new HashMap<>();

    {
        // 反射模拟 Spring 的依赖注入
        try {
            Class<?> singleChoice = Class.forName("com.sunxiansheng.design_pattern.factory_strategy.strategy.SingleChoice");
            Class<?> multipleChoice = Class.forName("com.sunxiansheng.design_pattern.factory_strategy.strategy.MultipleChoice");
            Class<?> judgment = Class.forName("com.sunxiansheng.design_pattern.factory_strategy.strategy.Judgment");
            Class<?> shortAnswer = Class.forName("com.sunxiansheng.design_pattern.factory_strategy.strategy.ShortAnswer");
            strategies.add((ISubjectStrategy) singleChoice.newInstance());
            strategies.add((ISubjectStrategy) multipleChoice.newInstance());
            strategies.add((ISubjectStrategy) judgment.newInstance());
            strategies.add((ISubjectStrategy) shortAnswer.newInstance());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    {
        // 将 list 转为 map
        strategies.forEach(strategy -> strategyMap.put(strategy.getSubjectType(), strategy));
    }

    /**
     * 根据题目类型获取策略
     *
     * @param subjectType
     * @return
     */
    public ISubjectStrategy getStrategy(SubjectType subjectType) {
        return strategyMap.get(subjectType);
    }
}

6. Client.java 客户端

package com.sunxiansheng.design_pattern.factory_strategy;

import com.sunxiansheng.design_pattern.factory_strategy.factory.Strategy;
import com.sunxiansheng.design_pattern.factory_strategy.strategyenum.SubjectType;

/**
 * Description: 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 策略工厂
        Strategy strategy = new Strategy();
        // 四种策略
        strategy.getStrategy(SubjectType.SINGLE_CHOICE).handleQuestion();
        strategy.getStrategy(SubjectType.MULTIPLE_CHOICE).handleQuestion();
        strategy.getStrategy(SubjectType.JUDGMENT).handleQuestion();
        strategy.getStrategy(SubjectType.SHORT_ANSWER).handleQuestion();
    }
}

7. 小结

工厂模式与策略模式结合首先需要定义策略的枚举类,设置不同题目类型的枚举值。接着定义一个策略接口,包含获取题目类型和处理题目的方法,各具体策略类实现该接口。随后实现一个策略工厂,通常使用 Spring 的依赖注入,本例中为了演示使用反射模拟初始化过程。在 Bean 初始化阶段,将策略列表转换为 Map,最后提供根据题目类型枚举获取对应策略的方法,从而实现业务逻辑的动态分发与解耦。

目录

  1. 工厂模式与策略模式结合的最佳实践
  2. 1. 目录结构
  3. 2. SubjectType.java 策略枚举类
  4. 3. ISubjectStrategy.java 策略接口
  5. 4. 策略接口实现类
  6. 1. Judgment.java
  7. 2. MultipleChoice.java
  8. 3. ShortAnswer.java
  9. 4. SingleChoice.java
  10. 5. Strategy.java 策略工厂
  11. 6. Client.java 客户端
  12. 7. 小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 人脸识别核心算法:FaceNet 与 ArcFace 原理及实战
  • CMake 项目中 Vcpkg、Conan 与 Spack 的 C++ 依赖管理对比
  • 前端程序员转型大模型工程师的实战指南
  • WhisperX 语音识别工具从零开始部署与配置指南
  • DeepSeek 深度使用指南:提示词技巧与本地知识库搭建
  • OpenClaw 集成 QVeris 实现 AI 助手实时数据查询
  • Windows 下创建与激活 Python 虚拟环境指南
  • VR 视频下载实战:N_m3u8DL-RE 高清全景获取指南
  • Coze 工作流核心节点实战:逻辑控制、数据处理及多媒体生成
  • Ollama 与 Open-WebUI 本地运行大模型
  • 初学者如何入门大语言模型开发
  • GitHub Copilot 完整使用指南:从安装到高级技巧
  • 人工智能产品经理核心技能与十种常用算法解析
  • uv 虚拟环境管理:venv 创建、激活与 Python 版本指定
  • C/C++ static 关键字详解与用法总结
  • 使用 ISAAC Lab 训练机器人行走
  • Linux OpenEuler 部署 Qwen3-32B 大模型华为昇腾 Arm 服务器 MindIE Docker Dify 方案
  • 如何把 AI 大语言模型接入个人项目
  • YT-DLP Web Player 开源在线视频播放器部署指南
  • 宇树 G1 机器人开发入门:有线与无线连接配置

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online