文章目录

  • 【Java设计模式】Builder模式:在Java中清晰构建自定义对象
    • 一、概述
    • 二、Builder设计模式的意图
    • 三、Builder模式的详细解释及实际示例
    • 四、Java中Builder模式的编程示例
    • 五、Builder模式类图
    • 六、Java中何时使用Builder模式
    • 七、Builder模式的优点和权衡
    • 八、源码下载

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

一、概述

在Java开发中,Builder模式是一种强大的创建型模式,它允许我们逐步构建复杂的对象。本文将详细介绍Builder模式的意图、解释、编程示例、适用场景以及实际应用。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

二、Builder设计模式的意图

Java中的Builder设计模式是一种基本的创建型模式,它允许逐步构建复杂的对象。它将复杂对象的构建与表示分离,使得相同的构建过程可以创建不同的表示。

三、Builder模式的详细解释及实际示例

  1. 实际示例
    • Java的Builder模式在对象创建涉及众多参数的场景中特别有用。
    • 想象一下,你在一家熟食店定制三明治。在这种情况下,Builder设计模式将涉及一个SandwichBuilder,它允许你指定三明治的每个组件,如面包类型、肉类、奶酪、蔬菜和调味品。你无需知道如何从头开始构建三明治,而是使用SandwichBuilder逐步添加每个所需的组件,确保你得到确切想要的三明治。这种将构建与最终产品表示分离的方式确保了相同的构建过程可以根据指定的组件生成不同类型的三明治。
  2. 通俗解释
    • 允许你创建对象的不同风格,同时避免构造函数污染。当对象可能有多种风格或创建对象涉及许多步骤时非常有用。
  3. 维基百科解释
    • Builder模式是一种对象创建软件设计模式,旨在解决伸缩构造函数反模式的问题。
    • 考虑一下伸缩构造函数反模式。在某些时候,我们都遇到过如下所示的构造函数:
public Hero(Profession profession,String name,HairType hairType,HairColor hairColor,Armor armor,Weapon weapon){
    // 值赋值
}
- 正如你所看到的,构造函数参数的数量可能会迅速变得过多,使得理解它们的排列变得困难。此外,如果将来决定添加更多选项,这个参数列表可能会继续增长。这就是所谓的伸缩构造函数反模式。

四、Java中Builder模式的编程示例

在这个Java Builder模式示例中,我们构建了具有不同属性的不同类型的Hero对象。

想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为你生成角色。但是,如果你更喜欢手动选择角色细节,如职业、性别、头发颜色等,角色创建就变成了一个逐步的过程,一旦完成所有选择就结束。

更合理的方法是使用Builder模式。首先,让我们考虑我们想要创建的Hero

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

然后可以这样使用:

  public static void main(String[] args) {
    var mage = new Hero.Builder(Profession.MAGE, "Riobard")
           .withHairColor(HairColor.BLACK)
           .withWeapon(Weapon.DAGGER)
           .build();
    LOGGER.info(mage.toString());
    var warrior = new Hero.Builder(Profession.WARRIOR, "Amberjill")
           .withHairColor(HairColor.BLOND)
           .withHairType(HairType.LONG_CURLY).withArmor(Armor.CHAIN_MAIL).withWeapon(Weapon.SWORD)
           .build();
    LOGGER.info(warrior.toString());
    var thief = new Hero.Builder(Profession.THIEF, "Desmond")
           .withHairType(HairType.BALD)
           .withWeapon(Weapon.BOW)
           .build();
    LOGGER.info(thief.toString());
}

程序输出:

16:28:06.058 [main] INFO com.iluwatar.builder.App -- This is a mage named Riobard with black hair and wielding a dagger.
16:28:06.060 [main] INFO com.iluwatar.builder.App -- This is a warrior named Amberjill with blond long curly hair wearing chain mail and wielding a sword.
16:28:06.060 [main] INFO com.iluwatar.builder.App -- This is a thief named Desmond with bald head and wielding a bow.

五、Builder模式类图

在这里插入图片描述

六、Java中何时使用Builder模式

在以下情况下使用Builder模式:

  1. Builder模式非常适合需要创建复杂对象的Java应用程序。
  2. 创建复杂对象的算法应该独立于构成对象的部分以及它们的组装方式。
  3. 构建过程必须允许构建的对象有不同的表示。
  4. 当产品需要许多步骤来创建,并且这些步骤需要按照特定顺序执行时,特别有用。

七、Builder模式的优点和权衡

  1. 优点
    • 与其他创建型模式相比,对构建过程有更多的控制。
    • 支持逐步构建对象,延迟构建步骤或递归运行步骤。
    • 可以构建需要复杂子对象组装的对象。最终产品与构成它的部分以及它们的组装过程分离。
    • 单一职责原则。你可以将复杂的构建代码与产品的业务逻辑分离。
  2. 权衡
    • 由于模式需要创建多个新类,代码的总体复杂性可能会增加。
    • 由于需要创建多个构建器对象,可能会增加内存使用。

八、源码下载

Builder模式示例代码下载

通过本文的介绍,相信大家对Java中的Builder模式有了更深入的了解。在实际开发中,合理运用Builder模式可以提高代码的可读性和可维护性,同时更好地构建复杂的对象。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐