java - 在 Java 中使用 Enum 进行工厂,最佳实践?

标签 java enums factory

Java 允许我们在 Enum 上嵌入数据和行为。 我不想直接在 Enum 上实现工厂,因为我认为这不是它的作用。

但我可以将类引用放在枚举上,并在外部工厂上构造对象。与传统的工厂模式相比,最适合您的实现方式是什么?在哪种情况下使用哪种解决方案更好?

现在,代码。

两种解决方案中用于构造对象的函数。如果需要,可用于使用 Map 实现 fly-weight 模式。

private Action getAction(Class<? extends Action> actionClazz) {
    // logger + error handling
    return actionClazz.newInstance();
}

1) 与传统工厂:

public enum ActionEnum {
    LOAD_DATA,
    LOAD_CONFIG;
}

public Action getAction(ActionEnum action) {
    switch (action) {
    case LOAD_CONFIG:
        return getAction(ActionLoadConfig.class);
    case LOAD_DATA:
        return getAction(ActionLoadData.class);
    }
}

2) 使用枚举式工厂:

public enum ActionEnum {
    LOAD_DATA(ActionLoadConfig.class),
    LOAD_CONFIG(ActionLoadData.class);

    public ActionEnum(Class<? extends Action> clazz){...}
    public Class<? extends Action> getClazz() {return this.clazz}
}

public Action getAction(ActionEnum action) {
    return getAction(action.getClazz());
}

最佳答案

第二个更简洁:它不需要任何长的 switch block ,并且像第一个一样忘记其中一个枚举值的风险为 0。

但并不总是可以使用它,因为枚举可能是一些通用枚举(例如,Month),不应与 Action 工厂耦合。

关于java - 在 Java 中使用 Enum 进行工厂,最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581310/

相关文章:

java - JmsTemplate 中的空指针异常?

运行 .sh 文件的 Java 方法

c# - 使用隐式枚举字段来表示数值是一种不好的做法吗?

c# - 实现具有不同返回类型的工厂模式

JavaScript DRY 对象构造函数

c++ - C++ 中的工厂模式和类模板

Java - 为什么这不起作用?

java - 使用Kafka消费者池是否正确?

数据库实体的 Java 构建器范例

python - 在 PySide2 中为 QML 注册枚举