Java程序

enum FILE_TYPE {
    XML, JSON;
}

interface Parser {
    void parse();
}
class XMLparser implements Parser {
    public void parse() { }
}
class JSONparser implements Parser {
    public void parse() { }
}

interface Mapper {
    void map();
}
class XMLmapper implements Mapper {
    public void map() { }
}
class JSONmapper implements Mapper {
    public void map() { }
}

class ParserFactory {
    public static Parser getInstance(FILE_TYPE fileType) {
        switch(fileType) {
        case XML:
            return new XMLparser();
        case JSON:
            return new JSONparser();
        }
        return null;
    }
}

class MapperFactory {
    public static Mapper getInstance(FILE_TYPE fileType) {
        switch(fileType) {
        case XML:
            return new XMLmapper();
        case JSON:
            return new JSONmapper();
        }
        return null;
    }
}


在上面的Java程序中,这两个工厂方法在这里根据相同条件生成不同的接口实例,即,两者都使用相同的枚举FILE_TYPE。

在这种情况下使用两个工厂方法是否正确?
约束是我不能将两个接口合并为一个。

我对Java设计非常陌生,请帮我

最佳答案

不,您当前的设计不正确。

您的代码明显违反了open closed principle,即您将在太多地方使用switch语句结束,这不是一个好的设计,因为如果您想添加HTML解析器(或以后的其他解析器),则需要添加switch语句分为两个Factory类。

解决方案是您需要使用抽象工厂模式,如下所示:

interface ContentHandler {
     public void parse();
     public void map();
}


public class XMLContentHandler implements ContentHandler {

    public void parse() { }

    public void map() { }
}


public class JSONContentHandler implements ContentHandler {

    public void parse() { }

    public void map() { }
}

class ContentFactory {
    public static ContentHandler getInstance(FILE_TYPE fileType) {
        switch(fileType) {
        case XML:
            return new XMLContentHandler();
        case JSON:
            return new JSONContentHandler();
        }
        return null;
    }
}



  我不想与系统共享映射器实现
  重用解析器。


ParsingMapping职责应由其自己的类(如XMLParserXMLMapperJSonParser等)处理,如下所示,然后将遵循single responsibility原则。

public class XMLContentHandler implements ContentHandler {

        @Inject
        private XMLParser xmlParser;

        @Inject
        private XMLMapper xmlMapper;


        public void parse() {
            xmlParser.parse();
        }

        public void map() {
            xmlMapper.map();
        }
}

08-18 15:24
查看更多