Java 需要关于解析器设计策略的建议吗

Java 需要关于解析器设计策略的建议吗,java,parsing,dependency-injection,abstract-factory,Java,Parsing,Dependency Injection,Abstract Factory,我需要一个关于解析器设计策略的建议 考虑到type1、type2、type3是三种不同格式的csv文件,分别由Parser1、Parser2、Parser3解析。 将来,这将演变为解析来自其他来源(如dbs)的信息。 此外,还会有新的解析器出现。设计解析器的最佳方法是什么?工厂/抽象工厂是一个很好的候选人吗? 一些好处和例子会有帮助吗 Type1 - Parser1 Type2 - Parser2 Type3 - Parser3 我已经写下我的代码,寻找有价值的建议 inter

我需要一个关于解析器设计策略的建议

考虑到
type1、type2、type3
是三种不同格式的csv文件,分别由
Parser1、Parser2、Parser3
解析。
将来,这将演变为解析来自其他来源(如dbs)的信息。
此外,还会有新的解析器出现。设计解析器的最佳方法是什么?
工厂
/
抽象
工厂是一个很好的候选人吗?
一些好处和例子会有帮助吗

Type1 - Parser1    
Type2 - Parser2    
Type3 - Parser3
我已经写下我的代码,寻找有价值的建议

interface Parser<T>{
    public List<T> parse (string s);
}

//where T - data model 

class Parser1CSV implements Parser<Model1>{
    //implement 
    //s-csv file
    public List<Model1> parse (string s){
    }
}

class Parser1DB implements Parser<Model1>{
    //implement 
    //s- connection string
    public List<Model1> parse (string s){
    }
}

class Parser2CSV implements Parser<Model2>{
    //implement 
    //s-csv file
    public List<Model2> parse (string s){
    }
}

//same way other parsers are implemented

interface AbstarctFactory<T>{
    public Parser<T> createParser();
}

class Parser1Factory implements AbstarctFactory<Model1>{
    private String type;
    Parser1Factory(String type){
        this.type = type;
    }

    public Parser<Model1> createParser(){
        if(type.equals("CSV"){
            return new Parser1CSV();
        }else if(type.equals("DB"){
            return Parser1DB();
        }else{
            throw UnSupportedOperationException("Not Supported.");
        }
    }
}

//same way other parser factories are implemented

class ParserFactory{
    public static <T> Parser<T> getParser(AbstarctFactory<T> factory){
        factory.createParser();
    }
}

//Usage:
Parser<Model1> parser = ParserFactory.getParser(new Parser1Factory("CSV"));
List<Model1> list = parser.parse(file);
接口解析器{
公共列表解析(字符串s);
}
//其中T-数据模型
类Parser1CSV实现解析器{
//实施
//s-csv文件
公共列表解析(字符串s){
}
}
类Parser1DB实现语法分析器{
//实施
//s-连接字符串
公共列表解析(字符串s){
}
}
类Parser2CSV实现解析器{
//实施
//s-csv文件
公共列表解析(字符串s){
}
}
//与其他解析器的实现方式相同
接口AbstractFactory{
公共解析器createParser();
}
类Parser1Factory实现AbstractFactory{
私有字符串类型;
Parser1工厂(字符串类型){
this.type=type;
}
公共解析器createParser(){
if(类型等于(“CSV”){
返回新的Parser1CSV();
}else if(类型等于(“DB”){
返回Parser1DB();
}否则{
抛出UnSupportedOperationException(“不受支持”);
}
}
}
//与其他解析器工厂的实现方式相同
类ParserFactory{
公共静态解析器getParser(AbstractFactory工厂){
createParser();
}
}
//用法:
Parser Parser=ParserFactory.getParser(新的ParserFactory(“CSV”);
List=parser.parse(文件);
目前,我没有使用DI框架。当我需要使用时,会有什么好处和影响?

1)设计问题有个人解释/品味的空间,但总而言之,我非常喜欢你的方法,因为它的灵活性和模块性,在行业中很常见。 有时我不需要工厂的等级制度,但很明显,这取决于具体情况

2) 你的“类解析器工厂”有什么用?我不认为它增加了灵活性/去耦,而不是传统的“newparserfactory(“CSV”).createParser()。。。但也许你有一些可行的设计意图,我错过了

3) 关于DI,我可以主要向Spring作证——您的代码将很好地使用它。DI的要点是“好的,您知道如何创建解析器,现在如何将它们传递给业务代码”?例如,如果您有一些“银行服务”:

// Without DI:
public class BankService {
   private AbstarctFactory factory= new Parser1Factory();
   public void depositFundsFromFile(File file){
      //  use factory
   }
}
// With DI:
public class BankService {
   @Autowired
   private AbstarctFactory factory; // will be injected by the framework
   public void depositFundsFromFile(File file){
      //  use factory
   }
}
=>DI使BankService真正独立于具体的工厂类型:BankService不包含具体的承诺“new Parser1 factory”,因此它可以与任何工厂一起工作,它甚至允许多个BankService实例共存,每个实例具有不同的工厂类型。。。然后,您将为框架提供关于如何创建具体因子的单独说明,例如“new Parser1 Factory(“CSV”)。使用spring,这些单独的说明以XML文件或@Configuration代码的形式出现

4) 根据需求,DI还可以注入解析器而不是工厂(同样,框架需要单独的解析器创建指令):


5)你可以考虑实现SunsFaseBeaBeo接口,虽然你不必这样做:这是一个合法的决定,以避免依赖框架的代码。

我投票把这个问题作为主题关闭,因为这个问题属于.@ SeleEnthuloTo这个问题对于程序员来说很不适合——它会被迅速否决和CLO。sed在那里,请参阅推荐阅读:@gnat关于去哪里的决定似乎非常复杂。因为我很少浏览程序员,所以我首先阅读了他们的。关于“关于软件开发的概念性问题”、“软件架构和设计”以及“算法和数据结构概念”的阅读“-除了《it's not about》一节中没有一点被击中之外,我得出结论,这似乎是一个地方。请告诉我哪里出了错,这个问题属于哪个地方。@gnat另外,OP在那里问了这个问题,并得到了投票(和回答)@Seelenvirtuose这个问题可能是程序员的话题,这不是问题所在。问题是,不管它在什么地方,它都不是一个很好的问题,因为它太宽泛了;我不知道为什么这篇文章的PSE十字柱得到了一张选票。谢谢佩利特。关于你的问题,我的“类解析器工厂”有什么用?在您现在指出我之后,我发现ParserFactory类并没有真正的好处。我参考了抽象工厂设计模式。那么抽象工厂的真正用途是什么?你能告诉我一些真实的案例吗?对我来说,Parser1工厂、Parser2工厂等…单个工厂就足够了。再次感谢您提供的详细答案。您好,关于您的特定ParserFactory,您看到的教程可能有一些详细的意图,我没有看到,但无论如何,Classic AbstractFactory不需要它。它只需要一段代码,最终选择一些具体的工厂类型。有点像工厂工厂的工厂(所以它类似于“getFactory”,返回newparserfactory、newparserfactory等,不管你在它们之间选择什么逻辑)。至于AbstractFactory,它有点像英语解释。AFAIK最初的GoF强调了创建一组相关对象的具体挑战。例如,UI小部件(按钮、复选框、RadioButton…)必须与某个主题一致(全黄或全蓝)。解决方案:AbstractFactory及其子类YellowshFactory、BluishFactory。。。然后是一些集中的逻辑
public class BankService ... {
   @Autowired
   private Parser parser; // will be injected from the framework
   public void depositFundsFromFile(File file){
      //  use parser
   }
}