【问题标题】:How to build abstract classes using builder pattern?如何使用构建器模式构建抽象类?
【发布时间】:2015-03-02 21:20:24
【问题描述】:

这是我拥有的抽象类

public abstract class AbstractActionModel implements IActionModel{
    public abstract void getModel();
    public abstract void getAction();
}

然后我想像下面这样使用这个抽象类:

this.getActions().put("sth", AbstractActionModel.builder().action("sth").build());

由于我无法实例化抽象类,因此构建器模式将无法工作。我也不知道有任何替代模式可以做到这一点。

注意:我也不知道从这个基类扩展的类。

【问题讨论】:

标签: java builder-pattern


【解决方案1】:

如果您想在不了解具体子类的情况下编写构建器,则代码的调用者必须提供有关要创建哪个子类的信息 - 通过提供实际的类对象或注册一组具有名称的类。例如:

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

请注意,抽象类将需要添加 setter 方法,以便构建器可以在不知道具体子类的情况下更新属性。

或者,您可以使用reflection 检查子类并调用其方法。

【讨论】:

  • 那么没有静态方法可以做到这一点吗?像这样 AbstractActionModel.builder() ?
  • 如果不提供一个具体的类或获得一个类的方法 - 如果你不知道它是什么,你怎么能构建它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多