다음과 같이 다양한 유형의 이벤트가 있습니다. 일반적으로 나는 더 많은 사건이있다. 다음은 지도에서 공장 패턴을 동적으로로드하는 방법은 무엇입니까?
EventA
EventB
EventC
EventD
EventE
내가 각 이벤트 유형 얻을 것이다 코드 : 각 이벤트에 대한
public void run() {
try {
while (!closed.get()) {
ConsumerRecords records = consumer.poll(10000);
// Handle new records
for (ConsumerRecord<String, String> record : records) {
GenericRecord payload = decoder.decode(record.value());
String eventType = String.valueOf(payload.get("eventType"));
String eventMapHolder = String.valueOf(payload.get("eventMapHolder"));
Map<String, String> eventHolder = parseStringToMap(eventHolder);
// here eventType will "EventA", "EventB" and so on
// pass eventType to get the individual factory for that event type
// and then pass eventHolder to a particular method of that factory class which calls appropriate Query method.
}
}
} catch (Exception e) {
// log error
}
}
을, 나는 다른 데이터베이스 쿼리 있지만이어야의 대부분을, 나는 하나의 데이터베이스를 수행 할 필요를 수행 할 필요가 모든 이들에게 공통적 인 쿼리. 예를 들어 :
EventA -----> QueryA, QueryB
EventB -----> QueryA
eventHolder EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
- 은 그럼 그때 내가 eventHolder지도를 전달합니다, 나는 내 질문에이 코드에서 이벤트 유형으로 "EventA"를 얻을 가정 해 봅시다 : 아래
는 흐름이 될 것입니다 메서드 (QueryA로 호출 해 봅시다)에이 메서드 내에서이 맵에서 일부 연산을 수행하고 새 Map을 반환합니다. 그리고 나서이 새로운 Map은 다른 메소드에 전달 될 것입니다 (QueryB를 호출 해 봅시다). 그리고 나서 우리는 그것에 대해 몇 가지 작업을 수행 한 다음 다른 Map을 반환 할 것이고 그 맵은 호출자에게 되돌아 갈 것입니다.EventA -----> QueryA, QueryB EventB -----> QueryA EventC -----> QueryA, QueryC EventD -----> QueryA, QueryD EventE ----->
- 이제 "EventB"가 내 질문에있는 코드에서 eventType으로오고, 다음으로 메소드에 eventHolder Map을 전달하고 (이 코드를 QueryA라고 부름),이 메소드에서이 맵에서 일부 작업을 수행한다고 가정 해 보겠습니다. 새로운지도를 반환하십시오. 그런 다음이지도가 호출자에게 다시 전달됩니다.
- 이제 "EventE"가 내 질문에있는 코드에서 eventType으로 온다고 가정하고 eventHolder Map을 EventE 클래스에 전달하고이 경우에 할 일이 없기 때문에이 맵을 전달할 것입니다. 그것은 발신자에게 돌아온다.
질문 :
디자인 패턴 내가 이런 종류의 문제에 대한 사용해야합니까? 나는 if/else 또는 bcoz를 사용하지 않기를 바란다. 일반적으로 이벤트 유형이 많아서 eventType 값을 전달하여 런타임에 동적으로로드 할 수있는 개별 팩토리를 만들 생각이다.
미리 모든 이벤트 유형을 알고 있기 때문에 모든 팩토리를 맵에 배치하여 초기화 할 수 있으며 코드를 실행하는 동안 eventType이 오면 맵에서 개별 팩토리를로드 할 수 있습니다.
이 문제에 적합한 디자인 패턴 인 경우 여기에서 추상 팩토리 패턴을 사용하여이를 수행 할 수 있습니까? "eventType"
을 해당 이벤트 유형의 인스턴스를 반환하는 팩토리의 키로 전달하고 싶습니다. 따라서 "EventA"
을 팩토리에 전달한 다음 "EventA"
에 대한 팩토리 클래스를 반환하면 내부적으로 QueryA 메서드를 호출하는 특정 클래스를 호출하고 QueryB 메서드를 호출하고 결국 Map을 반환합니다. 나는 위의 코드에서 그것을 출력 할 것이다. 다른 이벤트 유형에서도 마찬가지입니다.
나는이 사실에 대해 생각하고있었습니다. 이것이 공장 패턴으로 가능한지 확실하지 않거나 다른 디자인 패턴 일 수 있습니다.
EventFactory eventFactory = EventTypeFactory.getInstance().getFactory(eventType);
Map<String, String> holder = eventFactory.execute(eventHolder);
if-else 나 switch를 사용하지 않고도 이것을 할 수있는 아주 좋은 방법을 알고 있었지만 기억이 안납니다. 아마 좋은 잠 후 아침에. – Reek
반환 된지도의 목적은 무엇입니까? – Tony