0

我在java 库中寻找一个工厂实现,它在决定重新运行哪个对象(而不是swichcase )的部分使用hashMap ,类似于以下想法 -

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

如果您要提供几个开箱即用的实现,我会选择接口+枚举组合,它允许用户轻松选择,同时提供提供自己实现的自由:

机器人工厂.java

public interface RobotFactory {
    public Robot create();
}

机器人.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()

使用枚举的另一种方法(可能更符合您的意愿)是这样的:

机器人工厂.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 回答