これは、戦略パターンがニーズに合っているように思えます (GOF - http://en.wikipedia.org/wiki/Strategy_pattern )。
これをどれだけダイナミックにしたいかはわかりません。インターフェイスの 2 つの実装と、どちらかを選択するセレクター メソッドを用意するのが最も簡単です。しかし、インターフェイスの実装をその場で動的に生成するところまで行くこともできます。いずれにせよ、戦略パターンはこの種の複雑さを抽象化し、必要なランタイム基準に基づいてさまざまな動作を選択できるようにします。
クラスを動的にロードする例を次に示します。完全修飾クラス名がすでにわかっていて、オブジェクトに引数なしのコンストラクタがあると仮定します。
Class c = Class.forName("java.lang.Object");
Object o = c.newInstance();
System.out.println( "o = " + o );
この場合にキャッチする必要があるエラーは、InterruptedException、ClassNotFoundException、IllegalAccessException、InstantiationException です。かなりの数ですが、それらをすべて同じ方法で処理し、ユーザーの選択を拒否します。
引数付きのコンストラクターが必要な場合は、次のようにします。
Class c = Class.forName("java.lang.String");
Constructor cons = c.getConstructor( String.class ); // the args here are the expected types for the constructor that you require on the class
String s = (String) cons.newInstance( "hello" );
これにより、キャッチする必要がある例外がさらに追加されます: InterruptedException、ClassNotFoundException、IllegalAccessException、InstantiationException、NoSuchMethodException、InvocationTargetException。ただし、以前と同じ方法でユーザーの選択を拒否します。