首页 > 其他分享 >设计模式之美--工厂模式之工厂方法

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

时间:2022-12-13 17:56:59浏览次数:45  
标签:parserFactoryMap return String -- 工厂 new IRuleConfigParserFactory 设计模式 public

使用场景:对象创建的逻辑比较复杂,且对象种类较多。将创建对象的复杂逻辑放到对应工厂去实现。
优点:比简单工厂更符合开闭原则
缺点:如果创建对象的逻辑很简单,使用这种模式是过度设计
核心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();
    }
}

标签:parserFactoryMap,return,String,--,工厂,new,IRuleConfigParserFactory,设计模式,public
From: https://www.cnblogs.com/rbwbear/p/16979472.html

相关文章

  • windows 系统,PHP+Nginx 环境搭建
    本次选用各中间件的最新版本。Nginx-1.23.2+PHP8.2.0+Mysql8.0.31。先去各自官网下载windows对应的安装包备用。PHP安装解压安装包配置在解压的目录下复......
  • Java 基于springBoot 上传文件
    @RequestMapping("/uploadFile")@ResponseBodypublicMap<String,Object>uploadFile(@RequestParam(value="file")MultipartFile[]file,HttpServletRequ......
  • Educational Codeforces Round 139 (Rated for Div. 2)
    题目链接A直接计算即可位数为k首位数为a则\(ans=a+(k-1)\times9\)点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2e5+......
  • Java中ConcurrentHashMap,HashMap和HashTable区别,通过ConcurrentHashMap对key进行加锁
    一、什么是ConcurrentHashMapConcurrentHashMap和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。同时,ConcurrentHash......
  • Yearning建立流程和数据源进行测试
    1.前提说明前面已经搭建好了平台,并且接入了LDAP、邮箱和钉钉,现在就是建立一下数据源和流程来进行测试,如果有什么疑问可以看上一篇文章安装Yearning审核平台2.建立流程2.......
  • 2022-12-13 h5跳转小程序时传递参数报错:errMsg: openapi.urlscheme.generate:fail inv
    原因:参数格式错误。我的传参中包含了一些中文字符,这在微信的文档里可以看到是不允许的,见下文:通过scheme码进入小程序时的query,最大1024个字符,只支持数字,大小写英文以......
  • Powershell 压缩文件
    如何使用PowerShell压缩文件 它使用您要压缩的任何文件的路径(多个文件用逗号分隔),并将它们存档在您指定的目标位置。Compress-Archive-LiteralPath<PathToFiles>-D......
  • 介绍一下 websocket
    一般的http请求都是短连接,而webpack的使用可以建立长连接;什么是websocketwebsocket是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通信......
  • 项目搭建之虚拟环境
    项目搭建之虚拟环境为什么要用到虚拟环境在创建一个新的项目时,我们遵循一个原则,不需要用的模块,就不加载到本地。我们在pycharm创建项目时,如果都采取使用本地的解释器,那......
  • Linux网络设置
    一、基础网络命令1.查看网络配置1.1查看网络接口信息ifconfig  用法:1)ifconfig  具体网卡名称       #只显示具体网卡的详细信息(无论该网卡是否......