迄今为止,我使用以下的建造者模式实现(与此处描述的实现相反):
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()
方法中对必填参数进行验证。
什么是最佳实践?或者是否有更好的方法我没有考虑到?