设计模式之美--工厂模式之简单工厂

核心demo代码:

public class RuleConfigParserFactory {
    public static IRuleConfigParser createParser(String configFormat) {
        IRuleConfigParser parser = null;
        if ("json".equalsIgnoreCase(configFormat)) {
            parser = new JsonRuleConfigParser();
        } else if ("xml".equalsIgnoreCase(configFormat)) {
            parser = new XmlRuleConfigParser();
        } else if ("yaml".equalsIgnoreCase(configFormat)) {
            parser = new YamlRuleConfigParser();
        } else if ("properties".equalsIgnoreCase(configFormat)) {
            parser = new PropertiesRuleConfigParser();
        }
        return parser;
    }
}

/**
 * 简单工厂
 * @author lq
 * @version : RuleConfigSource.java, v 0.1 2022年12月13日 15:37 lq Exp $
 */
public class RuleConfigSource {

    public RuleConfig load(String ruleConfigFilePath) {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
        IRuleConfigParser parser = RuleConfigParserFactory.createParser(ruleConfigFileExtension);
        if (null == parser) {
            throw new InvalidRuleConfigException("rule config file format is not support: " + ruleConfigFilePath);
        }
        String configText = "";
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
    }

    /**
     * 解析文件名,获取扩展名
     * @param ruleConfigFilePath
     * @return
     */
    private String getFileExtension(String ruleConfigFilePath) {
        return "json";
    }
}

简单工厂和单例模式的组合使用demo

/**
 * 简单工厂和单例模式的结合
 * @author lq
 * @version : RuleConfigParserAndSingletonFactory.java, v 0.1 2022年12月13日 15:34 lq Exp $
 */
public class RuleConfigParserAndSingletonFactory {

    private static final Map<String, IRuleConfigParser> ruleConfigParserMap = new HashMap<>();

    static {
        ruleConfigParserMap.put("json", new JsonRuleConfigParser());
        ruleConfigParserMap.put("xml", new XmlRuleConfigParser());
        ruleConfigParserMap.put("yaml", new YamlRuleConfigParser());
        ruleConfigParserMap.put("properties", new PropertiesRuleConfigParser());
    }

    public static IRuleConfigParser createParser(String configFormat) {
        if (StringUtils.isEmpty(configFormat)) {
            return null;
        }
        IRuleConfigParser parser = ruleConfigParserMap.get(configFormat);
        return parser;
    }
}

其他类demo:

public interface IRuleConfigParser {

    /**
     * 解析文件
     * @param configText
     * @return
     */
    RuleConfig parse(String configText);
}

public class RuleConfig {
}

public class JsonRuleConfigParser implements IRuleConfigParser {
    @Override
    public RuleConfig parse(String configText) {
        return null;
    }
}

public class PropertiesRuleConfigParser implements IRuleConfigParser {
    @Override
    public RuleConfig parse(String configText) {
        return null;
    }
}

public class XmlRuleConfigParser implements IRuleConfigParser {
    @Override
    public RuleConfig parse(String configText) {
        return null;
    }
}

public class YamlRuleConfigParser implements IRuleConfigParser {
    @Override
    public RuleConfig parse(String configText) {
        return null;
    }
}
posted @   lq-12040  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示