建造者模式什么时候使用?

问题:建造者模式什么时候使用?

建造者模式在现实世界里面的使用例子是什么?它有啥用呢?为啥不直接用工厂模式

回答一

下面是使用这个模式的一些理由和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 {
    //required
    private final int size;

    //optional
    private 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值