私は以下のような様々な種類のイベントを持っています。一般的に私はより多くの出来事を持っています。以下はマップから工場パターンを動的に読み込む方法は?
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
}
}
、私は別のデータベースクエリを実行する必要があるが、それらのほとんどのために少なくとも、私は1つのデータベースを実行する必要がありますそれらのすべてに共通のクエリです。たとえば:
EventA -----> QueryA, QueryB
EventB -----> QueryA
eventHolder EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
- は、それでは、私はその後、私はeventHolder地図を渡します、私は私の質問を持っているコードでのeventTypeとして「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