我最近阅读了Effective,我发现Builder模式(item #2)非常有趣。然而,我有一个问题:既然我们可以这样做,为什么还要创建一个静态构建器:
// JavaBeans Pattern
public class NutritionFacts {
private int servingSize;
private int servings;
private int calories;
private int fat;
public NutritionFacts() {
}
public NutritionFacts servingSize(int val) {
this.servingSize = val;
return this;
}
public NutritionFacts servings(int val) {
this.servings = val;
return this;
}
public NutritionFacts calories(int val) {
this.calories = val;
return this;
}
public NutritionFacts fat(int val) {
this.fat = val;
return this;
}
}
//usage
NutritionFacts nf = new NutritionFacts().servingSize(5).servings(4).calories(3).fat(1);这样做时,我们可以避免创建2个实例。
你能解释一下这种方法有什么问题吗?
发布于 2017-07-19 17:56:16
Builder允许抽象构造过程。
假设你想让你的NutritionFacts是一个不可变的类。在这种情况下,Builder可以提供所有的设置器,并最终调用一个接受所有设置器的私有构造函数(未设置的构造器用合理的默认值填充),而类本身不提供任何设置器。
另一点是,您可能想要对值集进行一些验证,特别是值之间的关系。构建器模式将始终包含一个build()方法,您可以在其中执行此操作。
在您提供的示例中,setter方法实际上等同于在Builder或类本身中具有设置器方法。
发布于 2017-07-19 18:02:24
在每一步,你都有一个不完整的对象。构建器可以验证对象,这样您就可以保护人们不会滥用您的类。
https://stackoverflow.com/questions/45186879
复制相似问题