美文网首页程序员的小屋程序员Java 杂谈
设计模式学习笔记(4)构建者

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

作者: 摆码王子 | 来源:发表于2018-05-21 19:34 被阅读7次

    本文实例代码: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();
    
    

    总结

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

    个人博客同步更新,获取更多技术分享请关注:郑保乐的博客

    相关文章

      网友评论

        本文标题:设计模式学习笔记(4)构建者

        本文链接:https://www.haomeiwen.com/subject/ibvqjftx.html