4

在大多数情况下,当我们编写工厂方法时,它是一堆if可以不断增长的条件。编写这种方法最有效的方法是什么(if条件最少)?

public A createA(final String id) {
    if (id.equals("A1")) {
      return new A1();
    }
    else if (id.equals("A2")) {
      return new A2();
    }
    return null;
  }
4

3 回答 3

12

您可以使用Map<String, Supplier<A>>

Map<String, Supplier<A>> map = new HashMap<>();
map.put("A1", () -> new A1());
map.put("A2", () -> new A2());

...

public A createA(final String id) {
    Supplier<A> supplier = map.get(id);
    if (supplier != null) {
        return supplier.get();
    }
    throw new IllegalArgumentException("unknown id: " + id);
}

这使用标准的 Java 8 Supplier接口和 Java 8 lambda 语法,但您当然可以定义自己的 Supplier 接口,并使用匿名内部类创建实例。

于 2014-04-17T06:44:54.540 回答
1

我喜欢原型映射方法 - 只需在某个阶段填充原型 - 在静态块或类构造函数中。代码大致如下

  Map<String, A> archetypes;

  public A createA(final String id)
  {
     A a = archetypes.get(id);
     return (a!=null)?a.copy():null;
  }
于 2014-04-17T06:43:45.097 回答
-1

此方法是延迟初始化。假设您有与名称对应的类id

public A createA(final String id) {
  // warning, should not use an id string that is tainted (eg from user input)
  return (A) Class.forName(id).newInstance();
}
于 2014-04-18T19:40:50.100 回答