创建型设计模式
目标
将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。
解释
现实世界的例子:
设想一个角色扮演游戏的角色生成器。 最简单的选择是让电脑为你创造角色。 但是如果你想选择职业,性别,发色等角色细节时,角色的生成就成了一个循序渐进的过程,当所有的选择都准备好的时候就完成了。
简单的说:
允许您创建不同的对象风格,同时避免造成构造器污染。 当可能有几种风格的对象时 或者当创建对象时涉及很多步骤时该模式很有用。
维基百科:
构建者模式是一个对象创建的设计模式,旨在寻找重叠构造反模式的解决方案。
现在,让我加一些关于什么是重叠构造反模式。 某种情况下我们会看到了如下构造函数:
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {}
正如您所看到的,构造函数参数的数量可能会很快失控,并且从参数的排列方式来看可能难以理解这些参数。 再加上这个参数列表可以继续增长,如果你想在将来添加更多的选项。 这被称为重叠构造反模式。
编程示例
理智的选择是使用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 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();
适用性
当如下情况可以考虑使用构建者模式
- 创建复杂对象的算法应该独立于组成对象本身以及构建过程。
- 构建过程必须允许对构建的对象进行不同的表示
现实中的例子
- java.lang.StringBuilder
- java.nio.ByteBuffer as well as similar buffers such as FloatBuffer, IntBuffer and so on.
- java.lang.StringBuffer
- All implementations of java.lang.Appendable
- Apache Camel builders
