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;
}
}
我不想与系统共享映射器实现
重用解析器。
Parsing
和Mapping
职责应由其自己的类(如XMLParser
,XMLMapper
,JSonParser
等)处理,如下所示,然后将遵循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();
}
}