java的构造者模式(builder)

发布时间 2023-05-21 10:58:48作者: 贾志文

我们在工作中写代码会遇到一种情况,就是设置一个对象属性值,通常方式有两种:

1. Animal animal=new Animal("3岁",20kg,"牛奶");
2. Animal animal=new Animal();
   animal.setAge("3岁");
   animal.setWeight("20kg");
   animal.setFood("牛奶");

 

第一种方式:
  相当于在构造函数里传递参数,但这样加入参数的时候,不能明确的知道往这个对象里加入了什么属性的内容。

第二种方式:
  虽然可以根据set函数名看到将要设置的值是什么值,但是这种写发,略显冗余。

  在设计模式中有构造者模式(builder),在类的构造器或静态工厂具有多个参数。设计这种类时,builder模式就是个不错的选择。Demo代码如下:

 1 public class Purchase {
 2 private final String shipNo;
 3 private final String menuId;
 4 private final String menuName;
 5 private final Double price;
 6 
 7 public static class Builder {
 8     private final String shipNo;
 9     private String menuId;
10     private String menuName;
11     private final Double price = 0.0;
12 
13     public Builder(String shipNo) {
14         this.shipNo = shipNo;
15     }
16 
17     public Builder menuId(String val) {
18         menuId = val;
19         return this;
20     }
21 
22     public Builder menuName(String val){
23         menuName=val;
24         return this;
25     }
26 
27     public Purchase build() {
28         return new Purchase(this);
29     }
30 }
31 
32 private Purchase(Builder builder) {
33     shipNo = builder.shipNo;
34     menuId = builder.menuId;
35     menuName = builder.menuName;
36     price = builder.price;
37 }
38 }

 

其结果就是这种设置属性是多个方法连接的方式:

1 public static void main(String[] args) {
2   Purchase p=new Builder("S0001").menuId("11").menuName("宫保").build();
3   System.out.println(p.menuName);
4}

 

也有另一种方式,省去代码的builder写法,就是使用lombok:

import lombok.Builder;
import lombok.Data;

@Builder
@Data
public class LomBokDemo {

    private String name;
    private Integer age;
    public static void main(String[] args) {
        LomBokDemo wyz = LomBokDemo.builder().age(12).name("张三").build();
        System.out.println(wyz);

    }   
}