通俗易懂系列 | 设计模式(八):建造者模式

介绍#

今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,如工厂模式和抽象工厂模式。
当Object包含许多属性时,引入了Builder模式来解决Factory和Abstract Factory设计模式的一些问题。
当Object包含许多属性时,Factory和Abstract Factory设计模式存在三个主要问题。

  1. 从客户端程序传递到Factory类的参数太多,可能容易出错,因为大多数情况下,参数的类型是相同的,而从客户端来说,很难维护参数的顺序。
  2. 一些参数可能是可选的,但在Factory模式中,我们被迫发送所有需要发送为NULL的参数和可选参数。
  3. 如果对象很重并且它的创建很复杂,那么所有这些复杂性都将成为Factory类的一部分,令人困惑。

我们可以通过提供具有所需参数的构造函数然后使用不同的setter方法来设置可选参数来解决大量参数的问题。这种方法的问题是,除非明确设置所有属性,否则Object状态将不一致。

Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法,解决了大量可选参数和不一致状态的问题。

意图#

将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。

定义#

现实世界的例子

想象一下角色扮演游戏的角色生成器。最简单的选择是让计算机为您创建角色。但是如果你想选择职业,性别,头发颜色等角色细节,那么角色生成将成为一个循序渐进的过程,在所有选择准备就绪时完成。

简单来说

允许您创建不同风格的对象,同时避免构造函数被污染。当有几种不同的构造函数时很有用。或者在创建对象时涉及很多步骤。

维基百科说

构建器模式是对象创建软件设计模式,其目的是找到伸缩构造器反模式的解决方案。

话虽如此,让我补充说一下伸缩构造器反模式是什么。某时某刻,我们都会看到如下构造函数:

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

正如您所看到的,构造函数参数的数量很快就会失控,并且可能很难理解参数的排列。此外,如果您希望将来添加更多选项,此参数列表可能会继续增长。这就被称为"the telescoping constructor anti-pattern"(可伸缩构造器的反模式)。

理智的替代方案是使用Builder模式。

实例#

让我们看看如何在java中实现构建器设计模式。

  1. 首先,您需要创建一个静态嵌套类,然后将所有参数从外部类复制到Builder类。我们应该遵循命名约定,如果类名是Computer那么构建器类应该命名为ComputerBuilder。
  2. Java Builder类应该有一个公共构造函数,其中包含所有必需的属性作为参数。
  3. Java Builder类应具有设置可选参数的方法,并且应在设置可选属性后返回相同的Builder对象。
  4. 最后一步是build()在构建器类中提供一个方法,该方法将返回客户端程序所需的Object。为此,我们需要在Class中使用Builder类作为参数的私有构造函数。

下面是示例构建器模式示例代码,首先,我们有我们想要创造的英雄

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;  }}

然后我们有了建设者

public static class HeroBuilder {    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类只有getter方法,没有公共构造函数。因此,获取Hero对象的唯一方法是通过HeroBuilder类。

然后它可以用作如下,显示如何使用Builder类来获取对象:

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

使用场景#

使用Builder模式时

  • 用于创建复杂对象的算法应该独立于构成对象的部分以及它们如何组装
  • 构造过程必须允许对构造的对象进行不同的表示

JDK中的Builder设计模式示例#

Java类中的一些构建器模式示例是;

  • java.lang.StringBuilder#append()(未同步)
  • java.lang.StringBuffer#append()(synchronized)

总结#

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

这就是java中的构建器设计模式的全部内容。
翻译于:builder-design-pattern-in-java
参考:java-design-patterns

(0)

相关推荐

  • 通俗易懂系列 | 设计模式(六):责任链模式

    责任链设计模式是行为设计模式之一. 责任链模式用于在软件设计中实现松散耦合,其中来自客户端的请求被传递到对象链以处理它们.然后链中的对象将自己决定谁将处理请求以及是否需要将请求发送到链中的下一个对象. ...

  • 通俗易懂系列 | 设计模式(五):策略模式

    介绍# 策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略模式的最佳示例之一是Collections.sort()采用Compara ...

  • 通俗易懂系列 | 设计模式(一):模板模式

    实际开发中常常会遇到,代码骨架类似甚至相同,只是具体的实现不一样的场景.例如:流程都有开启.编辑.驳回.结束.每个流程都包含这几个步骤,不同的是不同的流程实例它们的内容不一样.共享单车都是先开锁.骑行 ...

  • ​PHP设计模式之建造者模式

    PHP设计模式之建造者模式 建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者.开发者.创建者的含义.很明显,这个模式又是一个创建型的模式,用来创建对象.那么它的特点是什么呢? ...

  • [PHP小课堂]PHP设计模式之建造者模式

    [PHP小课堂]PHP设计模式之建造者模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程 ...

  • 通俗易懂系列 | 设计模式(七):观察者模式

    介绍# 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为S ...

  • 通俗易懂系列 | 设计模式(三):适配器模式

    今天看了部特工电影,里面有个桥段,主角在直升机上和反派生死搏斗,而飞机则是无人驾驶的状态,有坠毁的危险.生死存亡,危急时刻主角让团队成员去驾驶,而团队成员很慌张地说:"Hey, man,你开 ...

  • 通俗易懂系列 | 设计模式(二):装饰模式

    2018国庆黄金周来了,恰值国庆黄金周节假日,我想高速上一定车山车海,还好我选择了高铁,不然肯定需要寻找项目合作人或在高速上吃创业人士的炒饭炒面了. 国庆7天长假,天气又如此的好,所谓风和日丽,如此良 ...