最合适的设计模式,根据输入文件选择解析器

时间:2017-07-27 01:34:24

标签: java design-patterns

我的输入文件采用所有XML / JSON / CSV / EXCEL格式。

我为所有人编写了单独的解析器。 但我想在运行时选择我的解析。

哪种设计模式最合适?

我已经实现了诸如

if(file.endsWith(".csv"))
return CSVParser();
if(file.endsWith(".json"))
return JSONParser();
if(file.endsWith(".xml"))
return XMLParser();
else
return EXCELParser();

建议/指南请。

4 个答案:

答案 0 :(得分:1)

Simple factory可以解决您的问题。它不是真正的设计模式(不是原始的GoF模式集),而是一种编码解决方案的方法(又名 idiom )。它与Factory Method和Abstract Factory不同(请参阅上面的链接以了解其中的区别)。

enter image description here

您不必使用静态方法。但是把它放在超类中是很实际的。

答案 1 :(得分:-1)

首先,所有解析器都实现相同的接口:

public class CSVParser implements Parser {}
public class JSONParser implements Parser {}
public class XMLParser implements Parser {}
public class EXCELParser implements Parser {}

然后有两个解决方案供参考:

1.在方法中使用解析器:

public Parser getParser(String file){
    if(file.endsWith(".csv"))
        return CSVParser();
    if(file.endsWith(".json"))
        return JSONParser();
    if(file.endsWith(".xml"))
        return XMLParser();
    else
        return EXCELParser();
}

2。使用enum

public class ParserEnum {
    CSVParser("csv", new CSVParser()),
    JSONParser("json", new JSONParser()),
    XMLParser("xml", new XMLParser()),
    EXCELParser("excel", new EXCELParser);

    private String type;
    private Parser parser;

    ParserEnum(String type, Parser parser) {
        this.type = type;
        this.parser = parser;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Parser getParser() {
        return parser;
    }

    public void setParser(Parser parser) {
        this.parser = parser;
    }
}

然后从枚举类型中获取解析器:

public Parser getParser(String file){
    if(file.endsWith(".csv"))
        return ParserEnum.CSVParser.getParser;
    // ...
}

答案 2 :(得分:-1)

您可以使用工厂设计模式。让子类决定基于输入实例化哪种类型的解析器。而且,解析器的客户端不必通过声明一个公共接口或抽象类来知道实例化哪种类型的解析器。 。对于客户来说,它就像

一样简单

Parser parser=ParserFactory.getParser(String file);

parser.parse(file);

答案 3 :(得分:-1)

由于解析器的数量是有限的并且接受相同的初始化参数,因此Prototype模式最适合如下。注意:Prototype使用克隆,并且不会每次都创建新对象。我相信我们需要非共享实例。

public class ParserRepository {
    private Map<String,BaseParser> prototypes = new HashMap<>();
    public ParserRepository(){
        prototypes.put(".csv",new CSVParser());
        prototypes.put(".json",new JSONParser());
        prototypes.put(".xml",new XMLParser());
    }

    public BaseParser getParser(String extension) {
        BaseParser parser = null;;
        try {
            parser = (BaseParser) prototypes.get(extension).clone();
        } catch (CloneNotSupportedException e) {
            // Handle exception here
            e.printStackTrace();
        }
        return parser;
    }
}

如果需要动态地将新原型添加到存储库,可以为ParserRepository类公开适当的方法。