Java позволяет нам вставлять данные и поведение в Enum. Я не хочу реализовывать factory непосредственно в Enum, потому что я думаю, что это не его роль.
Но я могу поместить ссылку класса на перечисление и конструировать объект на внешнем factory. По сравнению с традиционным шаблоном factory, что для вас лучше всего подходит? Какое решение лучше использовать в этом случае?
Теперь, код.
Функция, используемая в обоих решениях для построения объектов. Полезно для реализации шаблона fly-weight с картой, если требуется.
private Action getAction(Class<? extends Action> actionClazz) {
// logger + error handling
return actionClazz.newInstance();
}
1) С традиционным factory:
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) С Enum-стиле factory:
public enum ActionEnum {
LOAD_DATA(ActionLoadConfig.class),
LOAD_CONFIG(ActionLoadData.class);
public ActionEnum(Class<? extends Action> clazz){...}
public getClazz() {return this.clazz}
}
public Action getAction(ActionEnum action) {
return getAction(action.getClazz());
}