在大多数情况下,当我们编写工厂方法时,它是一堆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;
}
答案 0 :(得分:9)
您可以使用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接口,并使用匿名内部类创建实例。
答案 1 :(得分:1)
我喜欢原型地图方法 - 只需在某个阶段填充原型 - 无论是在静态块还是类构造函数中。代码看起来大致像这样
Map<String, A> archetypes;
public A createA(final String id)
{
A a = archetypes.get(id);
return (a!=null)?a.copy():null;
}
答案 2 :(得分:0)
这个方法是懒惰的初始化。假设您的类与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();
}