Builder模式在Java中解决了什么问题
正如我之前所说的, Builder模式是一种创新的设计模式,这意味着它可以解决与对象创建有关的问题。 Java中的构造函数用于创建对象,并且可以采用创建对象所需的参数。 问题开始于可以使用许多参数创建对象时,其中一些参数可能是必需的,而其他参数则是可选的 。 考虑一个用于创建Cake的类,现在您需要一些像鸡蛋,牛奶,面粉这样的项目来创建Cake。 它们中的许多是强制性的,其中一些是可选的,例如Cherry,fruits等。如果我们要针对不同种类的蛋糕重载构造函数 ,则将有许多构造函数,甚至更糟的是,它们将接受许多参数。
问题:
1)要维护的构造函数过多。
2)容易出错,因为许多字段具有相同的类型,例如糖和黄油都放在杯子中,所以如果您传递2杯黄油,则代替2杯糖,编译器不会抱怨,但是会得到几乎没有糖的黄油蛋糕,成本很高浪费黄油。
您可以通过创建Cake并添加成分来部分解决此问题,但这会带来另一个问题,即在构建过程中使Object处于不一致状态 ,理想情况下,在创建Cake之前,该蛋糕不可用。 这两个问题都可以通过使用Java中的Builder设计模式来解决。 Builder设计模式不仅可以提高可读性,而且还可以通过显式添加成分并使对象在完全构建后可用的方式来减少出错的机会。
顺便说一下,Java中已有许多设计模式教程,例如Java中的 Decorator模式教程和Observer模式 。 如果您还没有阅读过,那么值得一读。
Java中的Builder设计模式示例
我们将使用在Java中使用Builder设计模式创建Cake的相同示例。 在这里,我们在Cake中有一个静态的嵌套生成器类 ,用于创建对象。
Java Builder设计模式准则
1)在该类中创建一个名为Builder的静态嵌套类,该类的对象将由Builder生成。 在这个例子中是Cake。
2)Builder类将具有与原始类完全相同的字段集。 3)在本示例中,Builder类将公开添加配料的方法,例如sugar()。 每个方法将返回相同的Builder对象。 每个方法调用都会丰富Builder。
4)Builder.build()方法将所有构建器字段值复制到实际类中并返回Item类的对象。
5)Item类(我们正在为其创建Builder的类)应具有私有构造函数,以通过build()方法创建其对象,并防止外部人员访问其构造函数。
public class BuilderPatternExample {public static void main(String args[]) {//Creating object using Builder pattern in javaCake whiteCake = new Cake.Builder().sugar(1).butter(0.5). eggs(2).vanila(2).flour(1.5). bakingpowder(0.75).milk(0.5).build();//Cake is ready to eat :)System.out.println(whiteCake);}
}class Cake {private final double sugar; //cupprivate final double butter; //cupprivate final int eggs;private final int vanila; //spoonprivate final double flour; //cupprivate final double bakingpowder; //spoonprivate final double milk; //cupprivate final int cherry;public static class Builder {private double sugar; //cupprivate double butter; //cupprivate int eggs;private int vanila; //spoonprivate double flour; //cupprivate double bakingpowder; //spoonprivate double milk; //cupprivate int cherry;//builder methods for setting propertypublic Builder sugar(double cup){this.sugar = cup; return this; }public Builder butter(double cup){this.butter = cup; return this; }public Builder eggs(int number){this.eggs = number; return this; }public Builder vanila(int spoon){this.vanila = spoon; return this; }public Builder flour(double cup){this.flour = cup; return this; }public Builder bakingpowder(double spoon){this.sugar = spoon; return this; }public Builder milk(double cup){this.milk = cup; return this; }public Builder cherry(int number){this.cherry = number; return this; }//return fully build objectpublic Cake build() {return new Cake(this);}}//private constructor to enforce object creation through builderprivate Cake(Builder builder) {this.sugar = builder.sugar;this.butter = builder.butter;this.eggs = builder.eggs;this.vanila = builder.vanila;this.flour = builder.flour;this.bakingpowder = builder.bakingpowder;this.milk = builder.milk;this.cherry = builder.cherry; }@Overridepublic String toString() {return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + '}';} }
输出:
Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0}
Java中的生成器设计模式–优点和缺点
充分利用Builder模式也有一些缺点,但是如果您查看下面的内容,优点显然超过了Builder设计模式的缺点。 无论如何,这里都没有使用Java创建对象的Builder设计模式的优缺点。
优点:
1)如果创建对象所需的字段数大于4或5,则更具维护性。
2)不太容易出错,因为由于显式方法调用,用户将知道他们正在传递的内容。
3)更健壮,因为只有完全构造的对象可供客户端使用。
缺点: 1)冗长且代码重复,因为Builder需要从Original或Item类复制所有字段。
何时在Java中使用Builder Design模式? Builder模式是一种创建模式,当构造函数中所需的参数数量通常大于4或最多5时,应使用该模式。不要与Builder和Factory模式混淆。 Builder和Factory模式之间的区别,因为Factory可以用来创建同一接口的不同实现,但是Builder与其Container类绑定在一起,并且仅返回Outer类的对象。
这就是Java中的Builder设计模式 。 我们已经了解了为什么需要构建器模式,解决了什么问题,Java中的构建器设计模式示例以及最终何时使用构建器模式的优缺点。 因此,如果您不使用伸缩构造函数模式,或者选择不使用它,那么可以使用Builder模式。
参考: Java中的构建器设计模式– JCG合作伙伴 Javin Paul在Javarevisited博客上的示例教程 。
翻译自: https://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html