创建型设计模式

目标

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

解释

现实世界的例子:

设想一个角色扮演游戏的角色生成器。 最简单的选择是让电脑为你创造角色。 但是如果你想选择职业,性别,发色等角色细节时,角色的生成就成了一个循序渐进的过程,当所有的选择都准备好的时候就完成了。

简单的说:

允许您创建不同的对象风格,同时避免造成构造器污染。 当可能有几种风格的对象时 或者当创建对象时涉及很多步骤时该模式很有用。

维基百科:

构建者模式是一个对象创建的设计模式,旨在寻找重叠构造反模式的解决方案。

现在,让我加一些关于什么是重叠构造反模式。 某种情况下我们会看到了如下构造函数:

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

正如您所看到的,构造函数参数的数量可能会很快失控,并且从参数的排列方式来看可能难以理解这些参数。 再加上这个参数列表可以继续增长,如果你想在将来添加更多的选项。 这被称为重叠构造反模式。

编程示例

理智的选择是使用Builder模式。 首先创造我们想要的的英雄

  1. public final class Hero {
  2. private final Profession profession;
  3. private final String name;
  4. private final HairType hairType;
  5. private final HairColor hairColor;
  6. private final Armor armor;
  7. private final Weapon weapon;
  8. private Hero(Builder builder) {
  9. this.profession = builder.profession;
  10. this.name = builder.name;
  11. this.hairColor = builder.hairColor;
  12. this.hairType = builder.hairType;
  13. this.weapon = builder.weapon;
  14. this.armor = builder.armor;
  15. }
  16. }

然后创建我们的构建器

  1. public static class Builder {
  2. private final Profession profession;
  3. private final String name;
  4. private HairType hairType;
  5. private HairColor hairColor;
  6. private Armor armor;
  7. private Weapon weapon;
  8. public Builder(Profession profession, String name) {
  9. if (profession == null || name == null) {
  10. throw new IllegalArgumentException("profession and name can not be null");
  11. }
  12. this.profession = profession;
  13. this.name = name;
  14. }
  15. public Builder withHairType(HairType hairType) {
  16. this.hairType = hairType;
  17. return this;
  18. }
  19. public Builder withHairColor(HairColor hairColor) {
  20. this.hairColor = hairColor;
  21. return this;
  22. }
  23. public Builder withArmor(Armor armor) {
  24. this.armor = armor;
  25. return this;
  26. }
  27. public Builder withWeapon(Weapon weapon) {
  28. this.weapon = weapon;
  29. return this;
  30. }
  31. public Hero build() {
  32. return new Hero(this);
  33. }
  34. }

我们可以采取如下的方式使用:

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

适用性

当如下情况可以考虑使用构建者模式

  • 创建复杂对象的算法应该独立于组成对象本身以及构建过程。
  • 构建过程必须允许对构建的对象进行不同的表示

现实中的例子

感谢