Java 设计模式(二)《建造者模式》

博客专栏

建造者模式

  • 类型: 创建型
  • 难度:中级

更多设计模式小故事案例代码详解 >>点我!点我!点我!<< 设计模式,如此简单~


解决问题

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。


如何实现

将变与不变分离开


释义

实际例子

角色扮演类的游戏,在我们创建角色的时候,可以选择性别,身高,职业,如果我们要实现更为复杂的角色时,肤色,头发颜色等。但无论你怎么选择当你点击确认的时候你的角色就诞生了。

简单来讲

建造者模式可以让你使用同一个建造器,构建满足你要求的东西,无论组装的顺序,以及组装的内容多少。

百度百科的解释

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

维基百科的解释

Builder模式是一个对象创建设计模式,为了寻找伸缩构造函数来解决具体问题。

让我们看一看到底是什么是伸缩构造函数

public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {
}

就像你所看到的这样,这个构造函数的参数可能在不久的将来业务的增长,会越来越长,变得难以维护。


代码实例讲解

此时使用建造者模式就是一个不错的选择

public final class Hero {
  private final Profession profession;
  private final String name;
  private final HairType hairType;
  private final HairColor hairColor;
  private final Armor armor;
  private final Weapon weapon;

  private Hero(Builder builder) {
    this.profession = builder.profession;
    this.name = builder.name;
    this.hairColor = builder.hairColor;
    this.hairType = builder.hairType;
    this.weapon = builder.weapon;
    this.armor = builder.armor;
  }
}

然后我们需要有一个建造者 Builder

  public static class Builder {
    private final Profession profession;
    private final String name;
    private HairType hairType;
    private HairColor hairColor;
    private Armor armor;
    private Weapon weapon;

    public Builder(Profession profession, String name) {
      if (profession == null || name == null) {
        throw new IllegalArgumentException("profession and name can not be null");
      }
      this.profession = profession;
      this.name = name;
    }

    public Builder withHairType(HairType hairType) {
      this.hairType = hairType;
      return this;
    }

    public Builder withHairColor(HairColor hairColor) {
      this.hairColor = hairColor;
      return this;
    }

    public Builder withArmor(Armor armor) {
      this.armor = armor;
      return this;
    }

    public Builder withWeapon(Weapon weapon) {
      this.weapon = weapon;
      return this;
    }

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

然后他可以用作构建我们的参数。

Hero mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();

更多完整代码 ===>> 传送门


使用契机

什么时候使用建造者模式?

  • 需要生成的对象具有复杂的内部结构。
  • 构造过程允许对构造的对象有不同的展示结果。

优缺点

优点

  1. 建造者独立,易扩展。
  2. 于控制细节风险。

缺点

  1. 产品必须有共同点,范围有限制。
  2. 如内部变化复杂,会有很多的建造类。

就在你身边的实际应用

JDK1.9 中英文 chm 格式文档下载


参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • - (void)viewDidLoad { [superview DidLoad]; UIButton *butt...
    nothing_c阅读 1,235评论 0 0
  • 楼楼在结婚前便听说过婚姻是爱情的坟墓,是围墙。对此,楼楼并没有觉得这句话有多深刻。毕竟,冷暖自知,好与不好,又岂是...
    想与安阅读 2,732评论 0 0
  • 麦瑞阅读 1,768评论 0 0