设计模式之美--工厂模式之工厂方法

使用场景:对象创建的逻辑比较复杂,且对象种类较多。将创建对象的复杂逻辑放到对应工厂去实现。
优点:比简单工厂更符合开闭原则
缺点:如果创建对象的逻辑很简单,使用这种模式是过度设计
核心demo代码:

/**
 * 工厂方法
 * @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);
        IRuleConfigParserFactory parserFactory = RuleConfigParserFactoryMap.createParserFactory(ruleConfigFileExtension);
        if (null == parserFactory) {
            throw new InvalidRuleConfigException("rule config file format is not support: " + ruleConfigFilePath);
        }
        IRuleConfigParser parser = parserFactory.createParser();
        String configText = "";
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
    }

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

/**
 * 工厂的工厂
 * @author lq
 * @version : RuleConfigParserFactoryMap.java, v 0.1 2022年12月13日 16:11 lq Exp $
 */
public class RuleConfigParserFactoryMap {

    private static final Map<String, IRuleConfigParserFactory> parserFactoryMap = new HashMap<>();

    static {
        parserFactoryMap.put("json", new JsonRuleConfigParserFactory());
        parserFactoryMap.put("xml", new XmlRuleConfigParserFactory());
        parserFactoryMap.put("yaml", new YamlRuleConfigParserFactory());
        parserFactoryMap.put("properties", new PropertiesRuleConfigParserFactory());
    }

    public static IRuleConfigParserFactory createParserFactory(String type) {
        if (StringUtils.isEmpty(type)) {
            return null;
        }
        IRuleConfigParserFactory parserFactory = parserFactoryMap.get(type);
        return parserFactory;
    }
}

各类工厂demo:

public interface IRuleConfigParserFactory {
    IRuleConfigParser createParser();
}

public class JsonRuleConfigParserFactory implements IRuleConfigParserFactory {
    @Override
    public IRuleConfigParser createParser() {
        return new JsonRuleConfigParser();
    }
}

public class PropertiesRuleConfigParserFactory implements IRuleConfigParserFactory {
    @Override
    public IRuleConfigParser createParser() {
        return new PropertiesRuleConfigParser();
    }
}

public class XmlRuleConfigParserFactory implements IRuleConfigParserFactory {
    @Override
    public IRuleConfigParser createParser() {
        return new XmlRuleConfigParser();
    }
}

public class YamlRuleConfigParserFactory implements IRuleConfigParserFactory {
    @Override
    public IRuleConfigParser createParser() {
        return new YamlRuleConfigParser();
    }
}
posted @   lq-12040  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示