有工厂的Java库

时间:2012-12-13 11:23:14

标签: java hashmap factory

我在 java库中查找Factory实现,该实现在决定哪个对象的部分使用 hashMap retrun (而不是 swichcase ),类似于以下想法 -

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)中是否存在任何模式?

3 个答案:

答案 0 :(得分:1)

如果您要提供开箱即用的多个实现,我会使用interface + enum combo,这样可以让用户轻松选择,同时提供自己提供实现的自由:

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()

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

RobotFactories.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();

答案 1 :(得分:1)

  

java库(jre7)中是否存在任何模式?

如果真的意味着模式,那么问题就是荒谬的,因为Java(本身)没有模式。模式是程序员在编写代码时使用的东西......

如果您的意思是现有的类/ API会这样做,请认为答案是否定的。至少不是标准的Java库。

这可能会支持第三方库,但我怀疑不是......因为:

  • 实施此项目并没有很好的“增值”,因为它很容易实现。

  • 真正的通用实现在实现和使用时可能相当棘手。 (我正在考虑创建泛型类型参数的实例的问题......)

答案 2 :(得分:0)

我认为ClassLoader.loadClass做了类似的事情,但实际的代码是原生的。