暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设计模式之建造者模式

PiPiD 2020-09-02
158

设计模式之建造者模式


定义

  • 把对象的创建放在单独的 Builder 类中,负责参数的校验、对象的创建等工作

  • 对象相对比较复杂,通过不同的参数,定制化地创建出不同的对象

代码实现

 1public class Customer {
2  private String name;
3  private int age;
4  private String address;
5  private String occuapation;
6
7  private Customer(Builder builder) {
8    this.name = builder.name;
9    this.age = builder.age;
10    this.address = builder.address;
11    this.occuapation = builder.occuapation;
12  }
13  //...省略getter方法...
14
15  //我们将Builder类设计成了Customer的内部类。
16  public static class Builder {
17
18      private static Integer MIN_AGE = 0;
19      private static Integer MAX_AGE = 150;
20
21          private String name;
22          private int age;
23          private String address;
24          private String occuapation;
25
26
27    public Customer build() {
28      if (StringUtils.isBlank(name)) {
29        throw new IllegalArgumentException("...");
30      }
31      if (age < MIN_AGE || age > MAX_AGE) {
32        throw new IllegalArgumentException("...");
33      }
34
35      return new Customer(this);
36    }
37
38    public Builder setName(String name) {
39      this.name = name;
40      return this;
41    }
42
43    //省略其它set函数...
44  }
45}
46
47// 使用建造者模式来创建 Customer 对象
48Customer customer = new Customer.Builder()
49        .setName("张三")
50        .setAge(16)
51        .setAddress("四川省成都市")
52        .setOccupation("产品经理")
53        .build();

复制

建造者模式和工厂模式的区别:

工厂模式:
  • 用来创建不同但是相关类型的对象,由给定的类型来决定创建那种类型的对象

  • 例子:顾客在参观点餐,利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉

建造者模式:
  • 创建一种相对复杂的对象,通过不同的参数,定制化地创建不同的对象

  • 例子:对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、芝士,我们通过建造者模式根据用户选择的不同配料来制作披萨

应用场景

如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用,此时就可以用建造者模式来创建对象

  • 1. 如果把类的必填属性放到构造函数中,而必填属性比较多,那么构造函数的参数就会变得很多。如果使用 set() 方法来设置必填参数,那么必填参数校验的逻辑就无处安放了

  • 2. 如果类的属性之间有依赖关系或者约束条件,那么校验这些依赖关系或约束条件的逻辑就无处安放了

  • 3. 如果要创建不可变对象,要对象创建好之后,不能做修改,那么 set() 方法就无法暴露出来。构造函数配合 set() 方法来设置属性值的方式就不适用了


文章转载自PiPiD,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论