Java 生成器模式,但对象构造函数中的生成器
我是否仍在使用下面的实现遵循构建器模式? 让我困惑的是类“myClass”中受保护的构造函数。对于构建器模式,我的第一个想法是隐藏构建器应该构建的对象。但在这里我们没有。我不明白这是坏设计还是好设计Java 生成器模式,但对象构造函数中的生成器,java,builder,builder-pattern,Java,Builder,Builder Pattern,我是否仍在使用下面的实现遵循构建器模式? 让我困惑的是类“myClass”中受保护的构造函数。对于构建器模式,我的第一个想法是隐藏构建器应该构建的对象。但在这里我们没有。我不明白这是坏设计还是好设计 public class MyClass{ private final String x; private final String y; protected MyClass(MyBuilder builder){ this.x = builder.
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"));
}
}
构造函数受
保护
,以限制在受保护范围之外创建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
的构造函数现在是private
MyClass myClass = new MyBuilder().withX("xXx").withY("yYy").build();
构造函数受
保护
,以限制在受保护范围之外创建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
的构造函数现在是private
MyClass myClass = new MyBuilder().withX("xXx").withY("yYy").build();
与我见过的构建器实现不同(但不是说它不起作用)。受保护的构造函数也让我感到困惑。除非您创建了另一个扩展了
myClass
的类,否则如何调用该类?此时,构建器对于扩展类的功能可能会有所不同
我习惯于使用fluent构建器返回它正在构建的对象的实例,但这可能只是我的偏好
要构建的类:
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”
返回新的
myClass
,其中x
=“Default x”和y
=“Default y”与我见过的生成器实现不同(但不是说它不起作用)。受保护的构造函数也让我感到困惑。除非您创建了另一个扩展了myClass
的类,否则如何调用该类?此时,构建器对于扩展类的功能可能会有所不同
我习惯于使用fluent构建器返回它正在构建的对象的实例,但这可能只是我的偏好
要构建的类:
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”
返回新的
myClass
,其中x
=“Default x”和y
=“Default y”在当前实现中,如何调用受保护的构造函数?根据您发布的代码,生成器不是内联类。此外,您还没有在生成器中定义getX()
和getY()
。我假设它们不是自动生成的,但这个假设是基于我的c#知识,java不是我的普通语言受保护的构造函数在构建器构建方法中使用,如更新的代码所示。在您当前的实现中,如何调用受保护的构造函数?根据您发布的代码,生成器不是内联类。此外,您还没有在生成器中定义getX()
和getY()
。我假设它们不是自动生成的,但这种假设是基于我的c#知识,java不是我的普通语言受保护的构造函数用于构建器构建方法,如更新的代码所示。