如何使用构建器模式构建抽象类?

阿明

这是我的抽象类

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

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

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

由于我无法实例化一个抽象类,因此构建器模式将无法工作,我也不知道有其他替代模式可以执行此操作。

注意:我也不了解从该基类扩展的类。

脱氧核糖核酸

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

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方法,以便构建器可以在不了解具体子类的情况下更新属性。

另外,您可以使用反射来检查子类并调用其方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在构建器模式中将抽象类子类化?

来自分类Dev

如何使用构建器模式构建嵌套列表?

来自分类Dev

如何在Angular 8的抽象类和抽象类的实现中使用@Component装饰器?

来自分类Dev

Java:装饰器模式 - 对主要抽象类的引用

来自分类Dev

如何使用Espresso测试抽象类?

来自分类Dev

如何使用PHPunit测试抽象类?

来自分类Dev

如何使用抽象类并实现它们

来自分类Dev

使用继承的构建器模式

来自分类Dev

如何使用抽象类调用抽象函数

来自分类Dev

如何使用项目列表(继承自抽象类)作为其抽象类?

来自分类Dev

使用库中的抽象类时,如何解决“抽象类的深层复制”问题?

来自分类Dev

如何使用项目列表(继承自抽象类)作为其抽象类?

来自分类Dev

仅使用抽象类部分实现接口时如何满足编译器?

来自分类Dev

如何使用 JJTree 构建抽象语法树?

来自分类Dev

如何使用Spring创建和配置内部构建器类

来自分类Dev

如何使用Spring创建和配置内部构建器类

来自分类Dev

使用抽象类的ArrayList

来自分类Dev

使用IComparer的抽象类

来自分类Dev

TraversalEngine 抽象类使用

来自分类Dev

访客模式-接口与抽象类

来自分类Dev

抽象类,OOP设计模式

来自分类Dev

访客模式-接口与抽象类

来自分类Dev

实例化抽象类的模式?

来自分类Dev

抽象类的协方差模式

来自分类Dev

在构建器模式下使用异步任务

来自分类Dev

在for循环中使用构建器模式

来自分类Dev

在for循环中使用构建器模式

来自分类Dev

使用构建器模式进行对象验证

来自分类Dev

实施构建器模式