zoukankan      html  css  js  c++  java
  • 设计模式之美学习-创建型-工厂模式(十六)

    简单工厂

    if实现

    public class RuleConfigSource {
        //加载指定文件到config
        public RuleConfig load(String ruleConfigFilePath) {
            //获取文件后缀
            String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
            IRuleConfigParser parser = null;
            //根据后缀创建不同config
            if ("json".equalsIgnoreCase(ruleConfigFileExtension)) {
                parser = new JsonRuleConfigParser();
            } else if ("xml".equalsIgnoreCase(ruleConfigFileExtension)) {
                parser = new XmlRuleConfigParser();
            } else if ("yaml".equalsIgnoreCase(ruleConfigFileExtension)) {
                parser = new YamlRuleConfigParser();
            } else if ("properties".equalsIgnoreCase(ruleConfigFileExtension)) {
                parser = new PropertiesRuleConfigParser();
            } else {
                throw new InvalidRuleConfigException(
                        "Rule config file format is not supported: " + ruleConfigFilePath);
            }
            String configText = "";
            //从ruleConfigFilePath文件中读取配置文本到configText中
            RuleConfig ruleConfig = parser.parse(configText);
            return ruleConfig;
        }
    
        private String getFileExtension(String filePath) {
            //...解析文件名获取扩展名,比如rule.json,返回json
            return "json";
        }
    }

    面向对象优化

    《设计模式之美学习-如何进行面向对象设计(三)》《设计模式之美学习-设计原则之单一职责(四)》的基础上进行优化 1.解析file 2.工厂 3.读取文件 抽出来

    public class RuleConfigSource {
      public RuleConfig load(String ruleConfigFilePath) {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
        IRuleConfigParser parser = RuleConfigParserFactory.createParser(ruleConfigFileExtension);
        if (parser == null) {
          throw new InvalidRuleConfigException(
                  "Rule config file format is not supported: " + ruleConfigFilePath);
        }
    
        String configText = "";
        //从ruleConfigFilePath文件中读取配置文本到configText中
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
      }
    
      private String getFileExtension(String filePath) {
        //...解析文件名获取扩展名,比如rule.json,返回json
        return "json";
      }
    }
    
    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;
      }
    }

    工厂方法

    //抽象创建解析器接口
    public interface IRuleConfigParserFactory {
        IRuleConfigParser createParser();
    }
    
    //json解析器工厂
    public class JsonRuleConfigParserFactory implements IRuleConfigParserFactory {
        @Override
        public IRuleConfigParser createParser() {
            return new JsonRuleConfigParser();
        }
    }
    //xml解析工厂
    public class XmlRuleConfigParserFactory implements IRuleConfigParserFactory {
        @Override
        public IRuleConfigParser createParser() {
            return new XmlRuleConfigParser();
        }
    }
    //yaml解析工厂
    public class YamlRuleConfigParserFactory implements IRuleConfigParserFactory {
        @Override
        public IRuleConfigParser createParser() {
            return new YamlRuleConfigParser();
        }
    }
    //properties解析工厂
    public class PropertiesRuleConfigParserFactory implements IRuleConfigParserFactory {
        @Override
        public IRuleConfigParser createParser() {
            return new PropertiesRuleConfigParser();
        }
    }
    public class RuleConfigSource {
      public RuleConfig load(String ruleConfigFilePath) {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
    
        IRuleConfigParserFactory parserFactory = null;
        if ("json".equalsIgnoreCase(ruleConfigFileExtension)) {
          parserFactory = new JsonRuleConfigParserFactory();
        } else if ("xml".equalsIgnoreCase(ruleConfigFileExtension)) {
          parserFactory = new XmlRuleConfigParserFactory();
        } else if ("yaml".equalsIgnoreCase(ruleConfigFileExtension)) {
          parserFactory = new YamlRuleConfigParserFactory();
        } else if ("properties".equalsIgnoreCase(ruleConfigFileExtension)) {
          parserFactory = new PropertiesRuleConfigParserFactory();
        } else {
          throw new InvalidRuleConfigException("Rule config file format is not supported: " + ruleConfigFilePath);
        }
        IRuleConfigParser parser = parserFactory.createParser();
    
        String configText = "";
        //从ruleConfigFilePath文件中读取配置文本到configText中
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
      }
    
      private String getFileExtension(String filePath) {
        //...解析文件名获取扩展名,比如rule.json,返回json
        return "json";
      }
    }

    简单工厂和抽象方法 尽量选择抽象方法 因为每个解析器创建可能有定制的初始化步骤

    if方式优化

    public class RuleConfigSource {
      public RuleConfig load(String ruleConfigFilePath) {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
    
        IRuleConfigParserFactory parserFactory = RuleConfigParserFactoryMap.getParserFactory(ruleConfigFileExtension);
        if (parserFactory == null) {
          throw new InvalidRuleConfigException("Rule config file format is not supported: " + ruleConfigFilePath);
        }
        IRuleConfigParser parser = parserFactory.createParser();
    
        String configText = "";
        //从ruleConfigFilePath文件中读取配置文本到configText中
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
      }
    
      private String getFileExtension(String filePath) {
        //...解析文件名获取扩展名,比如rule.json,返回json
        return "json";
      }
    }
    
    //因为工厂类只包含方法,不包含成员变量,完全可以复用,
    //不需要每次都创建新的工厂类对象,所以,简单工厂模式的第二种实现思路更加合适。
    public class RuleConfigParserFactoryMap { //工厂的工厂
      private static final Map<String, IRuleConfigParserFactory> cachedFactories = new HashMap<>();
    
      static {
        cachedFactories.put("json", new JsonRuleConfigParserFactory());
        cachedFactories.put("xml", new XmlRuleConfigParserFactory());
        cachedFactories.put("yaml", new YamlRuleConfigParserFactory());
        cachedFactories.put("properties", new PropertiesRuleConfigParserFactory());
      }
    
      public static IRuleConfigParserFactory getParserFactory(String type) {
        if (type == null || type.isEmpty()) {
          return null;
        }
        IRuleConfigParserFactory parserFactory = cachedFactories.get(type.toLowerCase());
        return parserFactory;
      }
    }

    将if方式替代为 cache到map 然后根据key从map获取 

    抽象工厂

    抽象工厂是产品组的概念

    针对规则配置的解析器:
            基于接口IRuleConfigParser
            JsonRuleConfigParser
            XmlRuleConfigParser
            YamlRuleConfigParser
            PropertiesRuleConfigParser
    
            针对系统配置的解析器:基于接口ISystemConfigParser
            JsonSystemConfigParser
            XmlSystemConfigParser
            YamlSystemConfigParser
            PropertiesSystemConfigParser

    如 json和xml解析器

    //抽象工厂定义
    public interface IConfigParserFactory {
        IRuleConfigParser createRuleParser();
        ISystemConfigParser createSystemParser();
        //此处可以扩展新的parser类型,比如IBizConfigParser
    }
    //json解析器创建
    public class JsonConfigParserFactory implements IConfigParserFactory {
        //产品1 文件son解析器
        @Override
        public IRuleConfigParser createRuleParser() {
            return new JsonRuleConfigParser();
        }
    
        //产品2 系统json解析器
        @Override
        public ISystemConfigParser createSystemParser() {
            return new JsonSystemConfigParser();
        }
    }
    
    //xml解析器
    public class XmlConfigParserFactory implements IConfigParserFactory {
        //产品1 xmlconfig解析器
        @Override
        public IRuleConfigParser createRuleParser() {
            return new XmlRuleConfigParser();
        }
        //产品2 系统配置xml解析器
        @Override
        public ISystemConfigParser createSystemParser() {
            return new XmlSystemConfigParser();
        }
    }
    
    // 省略YamlConfigParserFactory和PropertiesConfigParserFactory代码
  • 相关阅读:
    $.unique()去重问题
    js判断中文
    js URL中文传参乱码
    zabbix添加nginx监控
    TCP/IP与OSI参考模型原理
    100个linux系统常用指令
    read指令使用方法
    grep与正则表达式使用
    shell脚本中case的用法
    shell脚本:变量,文件判断,逻辑运算等纪要
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12565948.html
Copyright © 2011-2022 走看看