建造者模式
- 类型: 创建型
- 难度:中级
更多设计模式小故事案例代码详解 >>点我!点我!点我!<< 设计模式,如此简单~
解决问题
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
如何实现
将变与不变分离开
释义
实际例子
角色扮演类的游戏,在我们创建角色的时候,可以选择性别,身高,职业,如果我们要实现更为复杂的角色时,肤色,头发颜色等。但无论你怎么选择当你点击确认的时候你的角色就诞生了。
简单来讲
建造者模式可以让你使用同一个建造器,构建满足你要求的东西,无论组装的顺序,以及组装的内容多少。
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
维基百科的解释
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();
使用契机
什么时候使用建造者模式?
- 需要生成的对象具有复杂的内部结构。
- 构造过程允许对构造的对象有不同的展示结果。
优缺点
优点
- 建造者独立,易扩展。
- 于控制细节风险。
缺点
- 产品必须有共同点,范围有限制。
- 如内部变化复杂,会有很多的建造类。
就在你身边的实际应用
- 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