设计模式学习笔记(4)构建者

本文实例代码:https://github.com/JamesZBL/java_design_patterns

构建者(Builder)模式通常用于将复杂对象的构造简化,将具体的构造过程与表示分离,使同样的构建过程可以创建不同的表示。使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式。建造模式可以将一个复杂对象的内部组成部分,与该对象本身的创建分离开来,从而使得复杂对象的组装更灵活。

实例

设想一个场景,可以出现在游戏中,需要生成一个虚拟的人物模型,人物主要包括几个简单的属性:姓名、年龄、国籍以及肤色。假如一个数据模型的拥有很多属性,如果单纯使用构造方法来实例化对象,势必会造成构造方法参数爆炸的问题,也可以称之为“反可伸缩构造方法模式”。代码的可读性和可靠性大大降低。此时,可以为这个对象创建的过程指定一个创建者,我们只需要向创建者描述该对象的一些具体细节,接下来的构造过程就统统交给创建者完成了。

构建者模式要解决的主要问题就是“不可伸缩构造方法模式”,顾名思义,对象的构造方法固定且参数较多,构造对象的时候很容易搞错:

public Person(String name,Integer age,Nationality nationality,SkinColor skinColor...){...}

如果一直这样下去,随着属性的增多,构造方法的参数的数量也会变得越来越多,对于开发人员是非常头疼的。对属性的更改使得构造方法的维护难度增加了不少,这就是所谓的“反可伸缩构造方法模式”。

Person.java

public class Person {
  private final String name;
  private final Integer age;
  private final Nationality nationality;

  public String getName() {
    return name;
  }

  public Integer getAge() {
    return age;
  }

  public Nationality getNationality() {
    return nationality;
  }

  public SkinColor getSkinColor() {
    return skinColor;
  }

  private final SkinColor skinColor;

  public Person(Builder builder) {
    this.name = builder.name;
    this.age = builder.age;
    this.skinColor = builder.skinColor;
    this.nationality = builder.nationality;
  }
}
public static class Builder {

    private String name;
    private Integer age;
    private Nationality nationality;
    private SkinColor skinColor;

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

    public Builder name(String name) {
      if (null == name) {
        throw new IllegalArgumentException("人必须有名字!");
      }
      this.name = name;
      return this;
    }

    public Builder nationality(Nationality nationality) {
      this.nationality = nationality;
      return this;
    }

    public Builder skinColor(SkinColor skinColor) {
      this.skinColor = skinColor;
      return this;
    }

    public Person build() {
      return new Person(this);
    }
}

现在就可以使用 Person.Builder 来构造一个 Person 对象了:

Person personWang = new Person.Builder()
    .name("小王")
    .age(25)
    .nationality(Nationality.CHINA)
    .skinColor(SkinColor.YELLOW)
    .build();

总结

建造者模式通常适用于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件架构中,有时候会出现复杂对象的创建工作,解决思路是通常由各个部分的子对象用一定的方法构造而成。并且为了适应需求的变化,这个复杂对象的内容通常也会面临着频繁的变化,但是用子对象将它们组合在一起的方式就相对容易接受这种变化了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.