如何改进生成器模式?问题
动机
最近,我搜索了一种在不向构造函数传递大量参数的情况下初始化复杂对象的方法。我尝试了生成器模式,但我不喜欢这样一个事实,即我无法在编译时检查我是否真的设置了所有需要的值。
传统建筑商模式
当我使用生成器模式创建我的对象时,创建更加“类型安全”,因为它更容易看到参数的用途:Complex
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
...
.build();
但现在我有了一个问题,我很容易错过一个重要的参数。我可以在方法内部检查它,但这只是在运行时。在编译时,如果我错过了什么,没有什么会警告我。build()
增强的生成器模式
现在我的想法是创建一个构建器,如果我错过了所需的参数,它会“提醒”我。我的第一次尝试如下所示:
public class Complex {
private String m_first;
private String m_second;
private String m_third;
private Complex() {}
public static class ComplexBuilder {
private Complex m_complex;
public ComplexBuilder() {
m_complex = new Complex();
}
public Builder2 setFirst( String first ) {
m_complex.m_first = first;
return new Builder2();
}
public class Builder2 {
private Builder2() {}
Builder3 setSecond( String second ) {
m_complex.m_second = second;
return new Builder3();
}
}
public class Builder3 {
private Builder3() {}
Builder4 setThird( String third ) {
m_complex.m_third = third;
return new Builder4();
}
}
public class Builder4 {
private Builder4() {}
Complex build() {
return m_complex;
}
}
}
}
如您所见,生成器类的每个 setter 返回不同的内部生成器类。每个内部构建器类只提供一个 setter 方法,最后一个类仅提供一个 build() 方法。
现在,对象的构造再次如下所示:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
.build();
...但是没有办法忘记所需的参数。编译器不会接受它。
可选参数
如果我有可选参数,我会使用最后一个内部生成器类来设置它们,就像“传统”生成器一样,返回自身。Builder4
问题
- 这是众所周知的模式吗?它有特殊的名字吗?
- 你看到任何陷阱吗?
- 你有什么想法来改进实现 - 从更少的代码行数的意义上?