这看起来像是构建器模式的一种形式(尽管实际上并非如此)。
通常(使用您的示例并假设它是不可变的)它遵循类似于以下的模式:
public class MyObject {
private final String name;
private final int height;
private final int width;
private final String color;
private final int age;
private MyObject(Builder builder) { // Notice this is private
name = builder.name;
height = builder.height;
width = builder.width;
color = builder.color;
age = builder.age;
}
// Getters
public static class Builder {
// Initialize these to defaults if you have any
private String name;
private int height;
private int width;
private String color;
private int age;
// Getters as usual
// Every setter looks like this:
public Builder setName(String name) {
this.name = name;
return this;
}
// Other setters
public MyObject build() {
return new MyObject(this);
}
}
}
然后使用它:
MyObject obj = new MyObject.Builder()
.setName("Foo")
.setHeight(5)
.setWidth(3)
.setColor("blue")
.setAge(7)
.build();
您还可以重用构建器:
MyObject.Builder builder = new MyObject.Builder();
MyObject obj1 = builder
.setName("Foo")
.setHeight(5)
.setWidth(3)
.setColor("blue")
.setAge(7)
.build();
MyObject obj2 = builder
.setName("Bar")
.build();
在这里,将具有与除 之外的所有obj2
属性相同的属性。obj1
name
这通常是长构造函数的替代方法。它还可以用于所有信息都不能立即获得的对象,并且您不想在需要创建对象的任何地方自己声明一堆变量。从最后一个示例中,您可以看到,如果您想要使用相同的属性初始化大量对象,而不必一遍又一遍地传递这些属性,则可以使用它。
结果是您拥有一个不可变对象,但您不必像使用构造函数或静态工厂方法那样同时设置/传递所有变量。
以下是一些参考资料:
- 维基百科构建器模式页面
- OODesign.com 的构建器模式页面(还详细说明了如何使用构建器模式的接口)
- Joshua Bloch's Effective Java - 2nd Edition is an excellent source of information about some of the patterns (and anti-patterns) in Java.