use*_*742 1 java oop interface
我应该如何调用具有返回类的新实例的抽象方法的接口?
例如,我有一个Foo类,它execute是一个Parser实现类的实例Runnable,它由一个实现ParserXXX接口的类创建.(不是直接创建Parser实例,为了允许使用自定义Parser)我该ParserXXX怎么称呼?
@FunctionalInterface // >Java 8
interface ParserXXX {
Runnable get(Data data);
}
class Parser implements Runnable {
...
}
class Foo {
private ParserXXX;
public Foo() {
xxx = new ParserXXX() { // anonymous class
@Override
public Runnable get(Data data) {
return new Parser(data);
}
}
xxx = Parser::new; // using method reference(>Java 8)
xxx = data -> new Parser(data); // using lambda function(>Java 8)
}
private void parse(Data data) {
execute(xxx.get(data));
}
}
Run Code Online (Sandbox Code Playgroud)
我想到了,但他们认为不合适:
这也是一种常见的设计模式还是反模式?
ParserFactory是您给出的示例中最常用的命名法,因为它与工厂模式非常接近.正如评论中所提到的,表达这种模式的更常见方式是返回一个类型的对象Parser而不是简单地Runnable调用创建Parser createParser(或者甚至只是create)而不是get.常规地,get指的是获得现有对象(即,私有字段保持值并且返回以使得两个后续调用get返回相同对象,直到重新分配字段)而不是为每个调用创建新对象.
例如,表达此模式的常用方法类似于以下内容:
@FunctionalInterface
interface ParserFactory {
Parser createParser(Data data);
}
Run Code Online (Sandbox Code Playgroud)
使用此样式,Data可以按如下方式解析实例:
Data data = // ...
ParserFactory factory = // ... using your anonymous inner-class ...
Parser parser = factory.createParser(data);
parser.run();
Run Code Online (Sandbox Code Playgroud)
即使将调用createParser存储为Runnable而不是Parser,此工厂表示仍然有效,因为Parser是Runnable.例如,以下两个调用createParser都是有效的:
Data data = // ...
ParserFactory factory = // ...
Runnable runnable = factory.createParser(data);
Parser parser = factory.createParser(data);
Run Code Online (Sandbox Code Playgroud)