java - 如何创建一个可以构建多种 Java 对象的 Builder?

标签 java design-patterns

我正在尝试创建一种多策略生成器。我的意思是这个构建器应该是通用的,并且应该根据实体类型有不同的方法。让我解释一下。

根据实体的不同,我们需要不同的方法。示例:

Builder<User> userBuilder;
userBuilder.withName(«Bob»);
userBuilder.withAge(17);

并且这个构建器必须没有其他方法!

Builder<Account> accountBuilder;
accountBuilder.withCounry(«Fr»);
accountBuilder.withNumber(2846218354);
accountBuilder.withCode(«X34»);

我应该使用什么模式?以及如何组织我的设计?

最佳答案

如果您要一个 Builder类型不需要知道任何有关它所操作的实体的信息,Java 无法按照您描述的方式轻松做到这一点。在 Builder<User>例如,withNamewithAge需要在编译时知道方法。

由于这些方法实际上并不存在,但需要动态添加,因此您必须编写一个自定义类加载器。一旦Builder类是链接的,您无法更改它,并且由于在您传入实体之前它不知道您想要什么方法,因此在您需要添加方法时更改为时已晚。

您可以通过使用反射来实现大部分目标。例如,您可以在Builder中有一个方法。比如说,with(String field, Class<?> c, Object value) 。然后,假设您正在构建的对象实例有一个名为“set___”的方法,您可以使用 Method 类以使用传入的值调用相应的 set 方法。

看起来像:

 Builder<Account> b = new Builder<>();
 b.with("AccountNumber", String.class, "5897-1048-2949");
     // this invokes "setAccountNumber" method on internal
     //   Account instance with "5897-1048-2949" cast to String

更好的主意是为您要构建的东西创建类:AccountBuilder , UserBuilder , 等等。这更清晰,并且可能是您在 Java 中可以做的最好的事情,而无需求助于自定义类加载器等奇异的解决方案。 (是的,您必须为每一个编写属性。)

但是,如果您决定需要进行大量构建,您可能需要考虑一种替代语言,使其更容易实现,例如 RubyElixir 。动态方法不是 Java 的强项,并且试图规避语言的限制只是为了实现特定的 API 通常是一个糟糕的主意。

关于java - 如何创建一个可以构建多种 Java 对象的 Builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25912679/

相关文章:

java - 尝试重启时 OkHttp WebSocket RejectedExecutionException

java - Android BroadcastReceiver 注册时出现空指针异常

language-agnostic - 列表中对象的 "order"属性的数据结构

Android MVP - Activity 应该是 View 还是 Presenter?

c# - 在 WCF 服务和独立线程之间进行通信的最佳方式是什么?

java - 处理事件的设计模式

Java 8 : Compare multiple attributes in two lists

Java 重写说明

java - 用Gson解析Json,没有[]的数组?

c++ - 使用基于 bool 值的两种方法之一调用方法时如何确保避免分支预测错误