【发布时间】:2021-09-29 14:24:42
【问题描述】:
迄今为止,我使用构建器模式的following 实现(与here 描述的实现相反):
public class Widget {
public static class Builder {
public Builder(String name, double price) { ... }
public Widget build() { ... }
public Builder manufacturer(String value) { ... }
public Builder serialNumber(String value) { ... }
public Builder model(String value) { ... }
}
private Widget(Builder builder) { ... }
}
这适用于我遇到的大多数需要使用各种必需/强制和可选参数构建复杂对象的情况。但是,我最近一直在努力理解当您的所有参数都是强制性的(或至少绝大多数都是强制性的)时,该模式有什么好处。
解决这个问题的一种方法是对传入它们自己的类的参数进行逻辑分组,以减少传递给构建器构造函数的参数数量。
例如,而不是:
Widget example = new Widget.Builder(req1, req2, req3,req4,req5,req6,req7,req8)
.addOptional(opt9)
.build();
分组如下:
Object1 group1 = new Object1(req1, req2, req3, req4);
Object2 group2 = new Object2(req5, req6);
Widget example2 = new Widget.Builder(group1, group2, req7, req8)
.addOptional(opt9)
.build();
虽然拥有单独的对象可以大大简化事情,但如果不熟悉代码,也会使事情变得有点难以理解。我考虑的一件事是将所有参数移动到它们自己的 addParam(param) 方法中,然后在 build() 方法中对所需参数执行验证。
什么是最佳实践,有没有我没有考虑过的更好的方法?
【问题讨论】:
-
Builder pattern with a twist 中描述了比任何当前答案更好的解决方案。使用不同的接口来设置每个必需的参数。
-
我尝试了@jaco0646 的建议,但我认为我开发了一个更好的选择:github.com/banterly91/… 随意查看
标签: java parameters design-patterns builder