我该怎么称呼创建实例的接口

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)

我想到了,但他们认为不合适:

  • ParserSupplier:供应商不参与争议
  • ParserConstructor:并不总是构造函数
  • ParserBuilder,ParserFactory
  • ParserGenerator,ParserProvider,ParserCreator

这也是一种常见的设计模式还是反模式?

Jus*_*ano 5

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,此工厂表示仍然有效,因为ParserRunnable.例如,以下两个调用createParser都是有效的:

Data data = // ...
ParserFactory factory = // ...

Runnable runnable = factory.createParser(data);
Parser parser = factory.createParser(data);
Run Code Online (Sandbox Code Playgroud)