Допустим, у меня есть класс enum - ConfigElement
, в котором есть некоторые члены, такие как GENERAL_CONFIG("General Configuration")
, TRANSIT_TIMES("Transit times")
.
Все отдельные классы этих элементов конфигурации реализуют общий интерфейс ConfigElementOP
,например
public class TransitTimesOp implements ConfigElementsOp{
//implementation of interface methods
}
Эти отдельные классы определяют определенное поведение, которое является для них специфичным.
Теперь контроллер приложения просто получает конкретный ConfigElement
, а затем с помощьюфабрики, находит класс, который имеет соответствующее поведение, и использует его соответствующим образом.
В настоящее время моя фабрика представляет собой просто статическую карту между ConfigElement
и ее классом поведения, как
public static Map<ConfigElement, ConfigElementsOp> ConfigElementBehaviourMap =
new HashMap<ConfigElement, ConfigElementsOp>();
ConfigElementBehaviourMap.put(ConfigElement.TRANSIT_TIMES, TransitTimesOp.class);
...
У меня есть две проблемы с этим:
Это правильный дизайн для фабрики?Мне кажется это более сложным, так как добавление любого нового элемента и поведения потребовало бы изменений во многих местах, и пропущение для включения его в эту статическую карту будет игнорироваться компилятором.
Допустим, мы идем с этим проектом фабрики (статическая карта), есть ли способ обеспечить, чтобы любой новый класс, определенный для элемента конфигурации, делал запись в эту карту.И любой такой промах будет ошибкой во время компиляции.
Использование можно описать следующим образом - для различных контроллеров потребуется различная поведенческая карта этого перечисления.Итак, допустим - у контроллера пользовательского интерфейса будет одна карта, в которой указано, как отображать конкретный элемент ConfigElement, в распоряжении Serializer будет другая карта, представляющая собой карту между ConfigElement и его конкретным сериализатором.Отдельные контроллеры, находясь в работе, получат соответствующее поведение для ConfigElement со своей карты и будут его использовать.
Заранее спасибо.