如何使用构建器模式构建抽象 类?
How to build abstract classes using builder pattern?
这个摘要class我有
public abstract class AbstractActionModel implements IActionModel{
public abstract void getModel();
public abstract void getAction();
}
然后我想像下面这样使用这个摘要class:
this.getActions().put("sth", AbstractActionModel.builder().action("sth").build());
因为我无法实例化抽象 class 构建器模式不会 work.I 也不知道有任何替代模式可以执行此操作。
注意:我也不知道从这个基础 class 扩展的 classes。
如果您想在不了解具体子classes 的情况下编写构建器,代码的调用者将必须提供有关要创建哪个子class 的信息 - 通过提供实际的 class 对象,或者用名称注册一组 classes。例如:
public class Builders
{
public static abstract class AbstractActionModel
{
public abstract void getModel();
public abstract void getAction();
public abstract void setAction(String action);
}
public static class ConcreteActionModel extends AbstractActionModel
{
public void getModel() {};
public void getAction() {};
public void setAction(String action) {};
}
public static class ModelBuilder
{
AbstractActionModel model;
Map<String, Class<? extends AbstractActionModel>> register = new HashMap<String, Class<? extends AbstractActionModel>>();
public void register(String key, Class<? extends AbstractActionModel> c) {register.put("concrete", ConcreteActionModel.class);}
public ModelBuilder choose(String key) throws InstantiationException, IllegalAccessException {
model = register.get(key).newInstance();
return this;
}
public ModelBuilder action(String action) {
model.setAction(action);
return this;
}
public AbstractActionModel build() {
return model;
}
}
public static void main(String[] args) throws Exception
{
ModelBuilder mb = new ModelBuilder();
mb.register("concrete", ConcreteActionModel.class);
mb.choose("concrete").action("sth").build();
}
}
请注意,抽象 class 需要添加 setter 方法,以便构建者可以在不知道具体子class 的情况下更新属性。
或者,您可以使用 reflection 检查子class 并调用它的方法。
这个摘要class我有
public abstract class AbstractActionModel implements IActionModel{
public abstract void getModel();
public abstract void getAction();
}
然后我想像下面这样使用这个摘要class:
this.getActions().put("sth", AbstractActionModel.builder().action("sth").build());
因为我无法实例化抽象 class 构建器模式不会 work.I 也不知道有任何替代模式可以执行此操作。
注意:我也不知道从这个基础 class 扩展的 classes。
如果您想在不了解具体子classes 的情况下编写构建器,代码的调用者将必须提供有关要创建哪个子class 的信息 - 通过提供实际的 class 对象,或者用名称注册一组 classes。例如:
public class Builders
{
public static abstract class AbstractActionModel
{
public abstract void getModel();
public abstract void getAction();
public abstract void setAction(String action);
}
public static class ConcreteActionModel extends AbstractActionModel
{
public void getModel() {};
public void getAction() {};
public void setAction(String action) {};
}
public static class ModelBuilder
{
AbstractActionModel model;
Map<String, Class<? extends AbstractActionModel>> register = new HashMap<String, Class<? extends AbstractActionModel>>();
public void register(String key, Class<? extends AbstractActionModel> c) {register.put("concrete", ConcreteActionModel.class);}
public ModelBuilder choose(String key) throws InstantiationException, IllegalAccessException {
model = register.get(key).newInstance();
return this;
}
public ModelBuilder action(String action) {
model.setAction(action);
return this;
}
public AbstractActionModel build() {
return model;
}
}
public static void main(String[] args) throws Exception
{
ModelBuilder mb = new ModelBuilder();
mb.register("concrete", ConcreteActionModel.class);
mb.choose("concrete").action("sth").build();
}
}
请注意,抽象 class 需要添加 setter 方法,以便构建者可以在不知道具体子class 的情况下更新属性。
或者,您可以使用 reflection 检查子class 并调用它的方法。