0

Javaライブラリの中で、 ( swichcaseの代わりに)再実行するオブジェクトを決定するセクションでhashMapを使用するFactory実装を探しています。次のアイデアのようなものです-

public class RobotFactory {

 private interface RobotFac{
  public Robot create();
 }

 private class RV1Fac implements RobotFac{
  public Robot create(){ return new RV1();}
 }

 private class RV2Fac implements RobotFac{
  public Robot create(){ return new RV2();}
 }

 private class AiboFac implements RobotFac{
  public Robot create(){ return new Aibo();}
 }

private hashMap<String,RobotFac> robotFactory ; 
public RobotFactory(){
  robotFactory=new HashMap<String,RobotFac> ();
  robotFactory.put("RV1", new RV1Fac());
  robotFactory.put("RV2", new RV2Fac());
  robotFactory.put("Aibo", new AiboFac());
 }
 public Robot createRobot(String type){
  return robotFactory.get(type).create();
 }
}

Javaライブラリ(jre7)の中にそのパターンはありますか?

4

3 に答える 3

1

Javaライブラリ(jre7)の中にそのパターンはありますか?

あなたが本当にパターンを意味しているなら、Java(それ自体)にはパターンがないので、質問は無意味です。パターンは、プログラマーがコードを書くときに使用するものです...

これを行う既存のクラス/API を意味する場合、答えはノーだと考えてください。少なくとも、標準の Java ライブラリはそうではありません。

これはサードパーティのライブラリでサポートされている可能性がありますが、そうではないと思われます...理由:

  • 自分で簡単に実装できるため、これを実装しても大きな「付加価値」はありません。

  • 真に汎用的な実装は、実装して使用するのがかなり難しい場合があります。(ジェネリック型パラメータのインスタンスを作成する問題を考えています...)

于 2012-12-13T11:36:05.600 に答える
1

すぐに使用できるいくつかの実装を提供する場合は、interface + enum の組み合わせを使用します。これにより、ユーザーが簡単に選択できると同時に、独自の実装を自由に提供できます。

RobotFactory.java

public interface RobotFactory {
    public Robot create();
}

Robots.java

public enum Robots implements RobotFactory {
Aibo {
    public Robot create() {
        return new Aibo();
    }
},
RV1 {
    public Robot create() {
        return new RV1();
    }
},
RV2 {
    public Robot create() {
        return new RV2();
    }       
};
public Robot create() {
    throw new UnsupportedOperationException();
}
}

今、人は簡単に言うことができます:Robots.Aibo.create();

または、文字列から型を決定する必要がある場合は、次のようにします。

Robots.valueOf(type).create()

列挙型を使用する別の方法(おそらくあなたの希望に沿ったもの)は次のとおりです。

RobotFactory.java

public enum RobotFactories implements RobotFactory {
    Aibo(Aibo.class),
    RV1(RV1.class),
    RV2(RV2.class);
    private Class<? extends Robot> robotClass;
    private RobotFactories(Class<? extends Robot> robotClass) {
        this.robotClass = robotClass;
    }
    public Robot create() {
        return robotClass.newInstance();
    }
}

これで、簡単に言うことができますRobotFactories.valueOf(type).create();

于 2012-12-13T11:33:39.950 に答える
0

ClassLoader.loadClass似たようなことをすると思いますが、実際のコードはネイティブです。

于 2012-12-13T11:38:07.260 に答える