1

デザインに関する質問があります。私はこれまでコードを書いていません。この時点でどのように実装するかを考えているだけです。タイプAのオブジェクトがあり、タイプBのオブジェクトが含まれています。オブジェクトのカテゴリ(インターフェイスまたは抽象クラス?)をBで定義したいと思います。次に、Bのサブタイプを定義するxmlファイルがあります。たとえば、BがDriveableという名前のインターフェイスである場合、「car」または「truck」は、タイプAに必要なDrivableオブジェクトとしてxmlで定義されている可能性があります。

私が考えていたのは、Bをインターフェイスにしてから、ファクトリメソッドを持つ静的ファクトリクラスを作成して、どのサブタイプBにxmlファイルを指定するかを決定することです。だから私の最初の質問は、これが問題に取り組むための最良の方法でしょうか?インターフェイスの代わりに抽象クラスを使用する方が良いでしょうか、それとも主に個人的な好みですか?

次に、インターフェイスを使用する場合は、ファクトリメソッド内で次のようにします。

B createB(File f){
    ...
    String type = ...
    if(type.equals("car"))
        return new CarType();
    else if(type.equals("truck"))
        return new TruckType();
    ...
    return null;
}

したがって、新しいBサブタイプを追加するたびに、このメソッドに別のifステートメントを追加する必要があります。これを行うためのより良い方法はありますか?私がしなければならないのは、新しいBサブタイプを作成してから、XMLを更新し、ファクトリメソッドを更新しないことだけですか?基本的に、Bのタイプをファクトリメソッドにハードコーディングしたくありません。私が上に持っているものがファクトリメソッドを使ったかなり標準的なプロトコルであるなら、私はそれをそのように扱うことができますが、まったく正しくないようです。

4

3 に答える 3

1

あなたができることは、xmlでB implsにしたい実際のクラス名を定義してから、次のようなジェネリッククラスコンストラクターを使用することです(エラー処理がありません)。


String bimplClassname = //read from xml
Class bimplClass = Class.forName(bimplClassname);
B newB = bimplClass.getConstructor(/*arg types*/).newInstance(/*args*/);
于 2012-10-23T21:13:21.190 に答える
0

何がオブジェクトの作成をトリガーするかによると思います。作成のきっかけとなるのがテキストの場合、既存のコードは小さなアプリケーションに適しています。Guiceのような依存性注入フレームワークを選択することもできます。

.equalsまた、文字列を比較するには、コードに示されている==ではなく、メソッドを使用する必要があることに注意してください。

于 2012-10-23T21:16:36.027 に答える
0

カーノルドの例から発展して、xml内のテキストと対応するjavaクラスの間でマップするマップをファクトリクラスに作成できます。

private final static Map<String, Class> typeMap;

static {
   typeMap = new HashMap<String, Class>();
   typeMap.put("car", CarType.class); 
   typeMap.put("truck", TruckType.class);
}

そしてあなたの方法で:

B createB(File f){
    ...
    String type = ...
    Class clazz = typemap.get(type);
    if (clazz == null){
        return null;
    }

    B newB = clazz.getConstructor(/*arg types*/).newInstance(/*args*/);
    return newB;
}

if / elseよりも保守が少し簡単ですが、それでも保守する必要があります。

于 2012-10-23T21:32:42.783 に答える