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)