问题:建造者模式什么时候使用?
建造者模式在现实世界里面的使用例子是什么?它有啥用呢?为啥不直接用工厂模式
回答一
下面是使用这个模式的一些理由和Java的样例代码,但是它是由设计模式的4个人讨论出来的建造者模式实现的。这些原理你可以在Java里面使用,也适用于其他编程语言
正如Joshua Bloch在第二版的Effective Java说过的那样:
建造者模式是一个很好的选择,当设计一个类,这个类的构造方法或者静态工厂有贼多的参数的时候
我们曾经都遇到一个类,就是带有一堆构造器,每个都参数列表都只是加一个参数
Pizza(int size) { ... }
Pizza(int size, boolean cheese) { ... }
Pizza(int size, boolean cheese, boolean pepperoni) { ... }
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }
这叫做重叠构造器模式。这种模式的问题就是一旦你有4,5个参数,你就很难记住参数的顺序和这种情况下应该用哪个构造器了
一个可以代替重叠构造器模式的就是Javabean模式了,你可以调用一个带强制参数的构造器,任何再调用其他的setter方法。
Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);
这里的问题就是这个对象经过几次的调用才被创建出来,在构造的过程中可能出现不一致的现象。这需要一些其他的工作去确保线程安全。
更好的选择当然是用建造者模式啦
public class Pizza {private int size;private boolean cheese;private boolean pepperoni;private boolean bacon;public static class Builder {//requiredprivate final int size;//optionalprivate boolean cheese = false;private boolean pepperoni = false;private boolean bacon = false;public Builder(int size) {this.size = size;}public Builder cheese(boolean value) {cheese = value;return this;}public Builder pepperoni(boolean value) {pepperoni = value;return this;}public Builder bacon(boolean value) {bacon = value;return this;}public Pizza build() {return new Pizza(this);}}private Pizza(Builder builder) {size = builder.size;cheese = builder.cheese;pepperoni = builder.pepperoni;bacon = builder.bacon;}
}
Pizza是不变的,所有参数的值也是在一个位置,那是因为Builder的setter方法放回一个builder对象,可以它们可以向下面那样连起来:
Pizza pizza = new Pizza.Builder(12).cheese(true).pepperoni(true).bacon(true).build();
文章翻译自Stack Overflow:https://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern