在Java中使用Enum进行工厂,最佳实践是什么?

2022-09-01 13:52:36

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

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

现在,代码。

两个解决方案中用于构造对象的函数。如果需要,可以使用地图实现蝇重量模式。

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());
}

答案 1

第二个更干净:它不需要任何长开关块,并且像第一个一样忘记枚举值之一的风险为0。

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


答案 2

这对我有用:

 enum ActionEnum
    {
      LOAD_DATA {

        @Override
        public ActionLoadData getInstance() {
            return new ActionLoadData ();
        }

    },
    LOAD_CONFIG {

        @Override
        public ActionLoadConfig getInstance() {
            return new ActionLoadConfig();
        }

    };

    public abstract ILightBulb getInstance();
}

class ActionFactory
{
    public  Action getAction(ActionEnum action)
    {
       return action.getInstance();
    }
}