java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Builder模式实现原理及优缺点

Java Builder模式实现原理及优缺点解析

作者:平头哥的技术博文

这篇文章主要介绍了Java Builder模式实现原理及优缺点解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Builder 模式中文叫作建造者模式,又叫生成器模式,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。下图是建造者模式的通用类图:


在建造者模式中,有如下4种角色:

建造者模式应用举例

家装

家装不管是精装还是简装,它的流程都相对固定,所以它适用于建造者模式。我们就以家装为例,一起来学习了解一下建造者模式。下图是家装建造者模式简单的 UML 图。

1、家装对象类

/**
 * 家装对象类
 */
public class House {
  // 买家电
  private String jiadian;

  // 买地板
  private String diban;
  // 买油漆
  private String youqi;

  public String getJiadian() {
    return jiadian;
  }

  public void setJiadian(String jiadian) {
    this.jiadian = jiadian;
  }

  public String getDiban() {
    return diban;
  }

  public void setDiban(String diban) {
    this.diban = diban;
  }

  public String getYouqi() {
    return youqi;
  }

  public void setYouqi(String youqi) {
    this.youqi = youqi;
  }

  @Override
  public String toString() {
    return "House{" +
        "jiadian='" + jiadian + '\'' +
        ", diban='" + diban + '\'' +
        ", youqi='" + youqi + '\'' +
        '}';
  }
}

2、抽象建造者 Builder 类

/**
 * 抽象建造者
 */
public interface HouseBuilder {
  // 买家电
  void doJiadian();
  // 买地板
  void doDiBan();
  // 买油漆
  void doYouqi();

  House getHouse();
}

3、具体建造者-简装建造者类

/**
 * 简装创建者
 */
public class JianzhuangBuilder implements HouseBuilder {

  private House house = new House();

  @Override
  public void doJiadian() {
    house.setJiadian("简单家电就好");
  }

  @Override
  public void doDiBan() {
    house.setDiban("普通地板");
  }

  @Override
  public void doYouqi() {
    house.setYouqi("污染较小的油漆就行");
  }

  @Override
  public House getHouse() {
    return house;
  }
}

4、具体建造者-精装建造者类

/**
 * 精装创建者
 */
public class jingzhuangBuilder implements HouseBuilder {

  private House house = new House();

  @Override
  public void doJiadian() {
    house.setJiadian("二话不说,最好的");
  }

  @Override
  public void doDiBan() {
    house.setDiban("二话不说,实木地板");
  }

  @Override
  public void doYouqi() {
    house.setYouqi("二话不说,给我来0污染的");
  }

  @Override
  public House getHouse() {
    return house;
  }
}

5、指挥官-家装公司类

/**
 * 家装公司,值需要告诉他精装还是简装
 */
public class HouseDirector {

  public House builder(HouseBuilder houseBuilder){
    houseBuilder.doDiBan();
    houseBuilder.doJiadian();
    houseBuilder.doYouqi();
    return houseBuilder.getHouse();
  }
}

6、测试

public class App {
  public static void main(String[] args) {
    house();
  }

  public static void house(){
    HouseDirector houseDirector = new HouseDirector();
    // 简装
    JianzhuangBuilder jianzhuangBuilder = new JianzhuangBuilder();
    System.out.println("我要简装");
    System.out.println(houseDirector.builder(jianzhuangBuilder));

    // 精装
    jingzhuangBuilder jingzhuangBuilder = new jingzhuangBuilder();
    System.out.println("我要精装");
    System.out.println(houseDirector.builder(jingzhuangBuilder));

  }
}

输出结果

我们以家装为例,实现了两个具体的建造者,一个简装建造者、一个精装建造者。我们只需要告诉家装公司,我是需要简装还是精装,他会去帮我们安排,我不需要知道里面具体的细节。怎么样,建造者模式学回了吗?

对象构建

在日常开发中,你是不是会经常看到下面这种代码:

return new Docket(DocumentationType.SWAGGER_2)
    .apiInfo(apiInfo())
    .select()
    .apis(RequestHandlerSelectors.basePackage("com.curry.springbootswagger.controller"))
    .paths(PathSelectors.any())
    .build();

是不是很优美?学会了 Builder 模式之后,你也可以通过这种方式进行对象构建。它是通过变种的 Builder 模式实现的。先不解释了,我们先用 Builder 模式来实现跟上述的对象构建,使用学生类为例。

学生对象代码:

public class Student {

  private String name;

  private int age;

  private int num;

  private String email;

  // 提供一个静态builder方法
  public static Student.Builder builder() {
    return new Student.Builder();
  }
  // 外部调用builder类的属性接口进行设值。
  public static class Builder{
    private String name;

    private int age;

    private int num;

    private String email;

    public Builder name(String name) {
      this.name = name;
      return this;
    }

    public Builder age(int age) {
      this.age = age;
      return this;
    }

    public Builder num(int num) {
      this.num = num;
      return this;
    }

    public Builder email(String email) {
      this.email = email;
      return this;
    }

    public Student build() {
      // 将builder对象传入到学生构造函数
      return new Student(this);
    }
  }
  // 私有化构造器
  private Student(Builder builder) {
    name = builder.name;
    age = builder.age;
    num = builder.num;
    email = builder.email;
  }

  @Override
  public String toString() {
    return "Student{" +
        "name='" + name + '\'' +
        ", age=" + age +
        ", num=" + num +
        ", email='" + email + '\'' +
        '}';
  }
}

调用代码:

  public static void student(){
    Student student = Student.builder().name("平头哥").num(1).age(18).email("平头哥@163.com").build();
    System.out.println(student);
  }

可以看到,变种 Builder 模式包括以下内容:

可能你会说,这种写法实现太麻烦了,确实需要我们写很多额外的代码,好在前辈们已经开发出了lombok来拯救我们,我们只需要引入lombok插件,然后在实体类上添加@Builder注解,你就可以实用 Builder 模式构建对象了。

建造者模式的优缺点

优点

缺点

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文