我在 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)中是否存在任何模式?
答案 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
做了类似的事情,但实际的代码是原生的。