我是否仍然遵循以下实施的Builder模式? 令我困惑的是班级中受保护的构造函数" myClass"。我首先想到的是构建器模式是隐藏构建器应该构造的对象。但是我们不在这里。我无法理解这只是糟糕的设计还是设计不错。
public class MyClass{
private final String x;
private final String y;
protected MyClass(MyBuilder builder){
this.x = builder.getX();
this.y = builder.getY();
}
//getters...
}
public class MyBuilder{
private String X;
private String Y;
public MyBuilder withX(String x){
this.x = x;
return this;
}
public MyBuilder withY(String y){
this.y = y;
return this;
}
public MyClass build(){
return new MyClass(this);
}
//getters....
}
public class Main{
public static void main(){
//Example 1
MyClass myClass = new MyBuilder().withX("x").withY("y").build();
//Example 2
MyClass myClass2 = new MyClass(new MyBuilder().withX("x").withY("y"));
}
}
答案 0 :(得分:3)
构造函数为protected
,以限制在受保护范围之外创建myClass
的新实例的可能性。
这看起来有点奇怪,因为通常构建器使用private
构造函数来完全避免客户端代码创建实例而不使用构建器。
如果你真的想要隐藏要构建的类的构造函数,可以将构建器创建为要构建的类的内部类:
public static class MyClass{
private final String x;
private final String y;
private MyClass(MyBuilder builder){
this.x = builder.x;
this.y = builder.y;
}
public static class MyBuilder{
private String x;
private String y;
public MyBuilder(){
}
public MyClass build() {
return new MyClass(this);
}
public MyBuilder withX(String x){
this.x = x;
return this;
}
public MyBuilder withY(String y){
this.y = y;
return this;
}
}
}
在这种情况下,创建新实例的唯一方法是使用构建器,因为MyClass
的构造函数现在是私有。
MyClass myClass = new MyBuilder().withX("xXx").withY("yYy").build();
答案 1 :(得分:0)
与我见过的构建器实现不同(不是说它不会起作用)。受保护的构造函数也让我感到困惑。除非你创建了另一个扩展myClass
的类,否则如何调用它?此时,您的构建器可能对扩展类的功能有所不同。
我过去常常使用流利的构建器来返回它所构建的对象的实例,但这可能仅仅是我的偏好。
要构建的类:
public class myClass{
private final String x;
private final String y;
public myClass(String x, String y){
this.x = x;
this.y = y;
}
}
生成器:
public class myBuilder{
private String X = "Default X";
private String Y = "Default Y";
public myBuilder withX(String x){
this.x = x;
return this;
}
public myBuilder withY(String y){
this.y = y;
return this;
}
public myClass build(){
return new myClass(y, x);
}
}
通话:
new myBuilder().withX("x").withY("y").build();
使用myClass
=" x"返回新的x
和y
=" y"
new myBuilder().build();
返回新的myClass
x
="默认X"和y
="默认Y"