【23种设计模式】建造者模式:理论剖析与Java实践

文章目录

建造者模式:理论、Java 实现与实践解析

一、建造者模式概述

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式的核心在于将复杂对象的创建过程分解为多个简单的步骤,由不同的建造者来实现这些步骤,最后通过一个指挥者来协调各个建造者,完成复杂对象的构建。这种模式适用于创建复杂对象的场景,如创建一个包含多个部件且部件之间有特定组合关系的产品,像电脑的组装(包括主机、显示器、键盘、鼠标等部件)或者一份具有多种配料和制作步骤的套餐等。

二、Java 实现示例

(一)产品类

首先定义要构建的复杂产品类,例如一个简单的电脑类:

java 复制代码
public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String graphicsCard;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public void setGraphicsCard(String graphicsCard) {
        this.graphicsCard = graphicsCard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", hardDisk='" + hardDisk + '\'' +
                ", graphicsCard='" + graphicsCard + '\'' +
                '}';
    }
}

(二)抽象建造者类

接着创建抽象建造者类,它定义了构建产品各个部件的抽象方法:

java 复制代码
public abstract class ComputerBuilder {
    protected Computer computer;

    public Computer getComputer() {
        return computer;
    }

    public void createComputer() {
        computer = new Computer();
    }

    public abstract void buildCpu();
    public abstract void buildMemory();
    public abstract void buildHardDisk();
    public abstract void buildGraphicsCard();
}

(三)具体建造者类

然后实现具体的建造者类,例如高性能电脑建造者和普通办公电脑建造者:

  1. 高性能电脑建造者:
java 复制代码
public class HighPerformanceComputerBuilder extends ComputerBuilder {
    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i9");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("32GB DDR4");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("1TB SSD");
    }

    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("NVIDIA GeForce RTX 3090");
    }
}
  1. 普通办公电脑建造者:
java 复制代码
public class OfficeComputerBuilder extends ComputerBuilder {
    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i3");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("8GB DDR4");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("500GB HDD");
    }

    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("Integrated Graphics");
    }
}

(四)指挥者类

最后创建指挥者类,它负责调用建造者的方法来构建产品:

java 复制代码
public class ComputerDirector {
    private ComputerBuilder builder;

    public ComputerDirector(ComputerBuilder builder) {
        this.builder = builder;
    }

    public Computer construct() {
        builder.createComputer();
        builder.buildCpu();
        builder.buildMemory();
        builder.buildHardDisk();
        builder.buildGraphicsCard();
        return builder.getComputer();
    }
}

三、关键步骤

(一)创建产品对象

在具体建造者类中,首先通过 createComputer 方法创建一个电脑对象实例,这是构建复杂对象的基础。例如在 HighPerformanceComputerBuilderOfficeComputerBuilder 类中都继承了这个方法来初始化电脑对象。

(二)构建部件

各个具体建造者类分别实现抽象建造者类中的抽象方法来构建产品的不同部件。如高性能电脑建造者会为电脑设置高性能的 CPU、大容量内存、高速硬盘和高端显卡;而普通办公电脑建造者则会设置相对较低配置的部件。

(三)指挥构建过程

指挥者类 ComputerDirector 接收一个具体的建造者对象作为参数,然后按照特定的顺序调用建造者的方法来构建完整的产品。它先调用 createComputer 初始化产品,接着依次调用构建各个部件的方法,最后返回构建好的电脑对象。

四、流程图

复制代码
开始
|
|-- 创建具体建造者对象(如 HighPerformanceComputerBuilder 或 OfficeComputerBuilder)
|   |
|   |-- 创建指挥者对象,并传入建造者对象
|   |   |
|   |   |-- 指挥者调用 construct 方法
|   |   |   |
|   |   |   |-- 建造者调用 createComputer 方法创建产品对象
|   |   |   |
|   |   |   |-- 建造者依次调用 buildCpu、buildMemory、buildHardDisk、buildGraphicsCard 方法构建部件
|   |   |   |
|   |   |   |-- 指挥者返回构建好的产品对象
结束

五、应用场景

  • 复杂对象构建:当创建的对象具有较多的组成部分,并且这些部分的组合方式较为复杂时,建造者模式能够清晰地将构建过程分步骤进行,提高代码的可读性和可维护性。例如构建一辆汽车,涉及到发动机、底盘、车身、内饰等多个复杂部件的组装。
  • 对象构建过程的定制化:如果需要根据不同的需求或条件构建不同配置或样式的同一类对象,建造者模式可以方便地通过不同的建造者来实现。比如构建不同风格的房屋,有欧式风格、中式风格等,每种风格在墙体、屋顶、门窗等部件的构建上有不同的要求。

六、优缺点

(一)优点

  • 解耦构建过程与产品表示:使得产品的构建过程和最终的产品表示可以独立变化,互不影响。例如可以在不改变电脑产品类的情况下,通过修改建造者类来改变电脑的配置构建方式。
  • 便于精细化控制构建过程:可以精确地控制复杂对象的构建步骤和顺序,确保每个部件都按照要求进行构建。
  • 代码复用性和扩展性好:通过抽象建造者类和具体建造者类的设计,可以方便地增加新的建造者来创建新的产品变体,同时指挥者类也可以复用。

(二)缺点

  • 增加代码复杂度:由于引入了多个类(抽象建造者、具体建造者、指挥者等),会使代码结构相对复杂,对于简单对象的构建可能会显得过于繁琐。
  • 需要额外的代码维护成本:要维护建造者类、指挥者类以及它们之间的关系,增加了代码的维护工作量。

七、总结

建造者模式在处理复杂对象的构建时提供了一种有效的解决方案,通过将构建过程分解并由专门的建造者和指挥者来处理,提高了代码的灵活性、可维护性和可扩展性。在实际应用中,需要根据对象的复杂程度、构建的多样性以及项目的整体架构等因素来决定是否采用建造者模式,以达到最佳的设计效果并平衡代码的复杂度和维护成本。

相关推荐
间彧6 分钟前
Spring Boot集成Spring Security完整指南
java
间彧30 分钟前
Spring Secutiy基本原理及工作流程
java
数据智能老司机1 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机2 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole4 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊4 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端