java - 没有 if, switch 实现工厂的最佳方式

标签 java design-patterns factory factory-pattern

我正在寻找在 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/

相关文章:

c++ - 具有多个继承共享一个资源的对象 - 寻找好的设计模式

java - 在Java中标记类的方法是框架私有(private)的

C++(有点)工厂

java - 带有 JavaFX 和 FXML 的 MVC

java - 如何在 Eclipse 的调试控制台中打印 Java 对象的当前值?

java - Jsoup:在不同类之间选择 HTML

angularjs - angular.service

java - 如何在java中的方法退出时删除文件?

java - 是否应该使用异常将流程退回到主流程?

java - 在java中创建静态泛型工厂?