我正在寻找在 Java 中实现工厂模式的许多方法,但仍然找不到一个完美的方法,它不会同时受到 if/switch 和不使用反射的影响。 我发现的最好的答案之一是 Tom Hawtin 的回答:https://stackoverflow.com/a/3434505/1390874
但我最担心的是它在内存中存储了一个匿名类的 HashMap。
问题是除了 Tom Hawtin 的回答之外,人们对使用 Class.newInstance() 有什么看法? 这样可以避免我们在内存中存储不必要的匿名类?加上代码会更干净。
它看起来像这样:
class MyFactory {
private static final Map<String,Class> factoryMap =
Collections.unmodifiableMap(new HashMap<String,Class>() {{
put("Meow", Cat.class);
put("Woof", Dog.class);
}});
public Animal createAnimal(String action) {
return (Animal) factoryMap.get(action).newInstance();
}
}
最佳答案
如果您使用的是 java 8,您可以设置一个 enum
像这样:
enum AnimalFarm {
Meow(Cat::new),
Woof(Dog::new);
public final Supplier<Animal> factory;
private AnimalFarm(Supplier<Animal> factory) {
this.factory = requireNonNull(factory);
}
}
......
Animal dog = AnimalFarm.valueOf("Woof").factory.get();
你甚至可以拥有 enum
实现 Supplier<Animal>
然后做 AnimalFarm.valueOf("Meow").get();
.
关于java - 没有 if, switch 实现工厂的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504945/