深入浅出建造者模式-干货!

简介: 深入浅出建造者模式-干货!

1 简介

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

实用范围
  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2. 当构造过程必须允许被构造的对象有不同表示时。
角色

网络异常,图片无法展示
|


在这样的设计模式中,有以下几个角色:

  • builder:为创建一个产品对象的各个部件指定抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  • Director:构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

2 应用场景

  • 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
  • 多个部件都可以装配到一个对象中,但产生的运行结果不相同
  • 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
  • 初始化一个对象时,参数过多,或者很多参数具有默认值
  • Builder模式不适合创建差异性很大的产品类,产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

3 代码案例

3.1 案例1

场景:

小明要组装一个电脑,现在有Apple和ASUS两个电脑店,他要选择其中一个去组装一个电脑,电脑的构成无非就是主机、显示器、鼠标和键盘,所以这是组装电脑的一个抽象,两个电脑店是抽象的具体实现,然后电脑店就是一个使用构造接口的对象(可以看做是组装者),最后是Product(组装出来的产品),下面是类关系图:

类关系图:

网络异常,图片无法展示
|


代码:

Computer.java

/**
 * @desc: 电脑实体类
 * @author: YanMingXin
 * @create: 2021/8/19-15:48
 **/
public class Computer {
    public String host;
    public String screen;
    public String mouse;
    public String keyBoard;
    public Computer(String host, String screen, String mouse, String keyBoard) {
        this.host = host;
        this.screen = screen;
        this.mouse = mouse;
        this.keyBoard = keyBoard;
    }
    public Computer() {
    }
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getScreen() {
        return screen;
    }
    public void setScreen(String screen) {
        this.screen = screen;
    }
    public String getMouse() {
        return mouse;
    }
    public void setMouse(String mouse) {
        this.mouse = mouse;
    }
    public String getKeyBoard() {
        return keyBoard;
    }
    public void setKeyBoard(String keyBoard) {
        this.keyBoard = keyBoard;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "host='" + host + '\'' +
                ", screen='" + screen + '\'' +
                ", mouse='" + mouse + '\'' +
                ", keyBoard='" + keyBoard + '\'' +
                '}';
    }
}
复制代码

Builder.java

/**
 * @desc: 抽象建造者
 * @author: YanMingXin
 * @create: 2021/8/19-16:05
 **/
public abstract class Builder {
    abstract void buildHost();
    abstract void buildScreen();
    abstract void buildMouse();
    abstract void buildKeyBoard();
    abstract Computer createComputer();
}
复制代码

AppleComputerBuilder.java

/**
 * @desc: AppleComputer具体建造者
 * @author: YanMingXin
 * @create: 2021/8/19-16:09
 **/
public class AppleComputerBuilder extends Builder {
    private Computer computer = new Computer();
    @Override
    void buildHost() {
        computer.setHost("Apple Host");
    }
    @Override
    void buildScreen() {
        computer.setScreen("Apple Screen");
    }
    @Override
    void buildMouse() {
        computer.setMouse("Apple Mouse");
    }
    @Override
    void buildKeyBoard() {
        computer.setKeyBoard("Apple KeyBoard");
    }
    @Override
    Computer createComputer() {
        return computer;
    }
}
复制代码

ASUSComputerBuilder.java

/**
 * @desc: ASUSComputer具体建造者
 * @author: YanMingXin
 * @create: 2021/8/19-16:10
 **/
public class ASUSComputerBuilder extends Builder {
    private Computer computer = new Computer();
    @Override
    void buildHost() {
        computer.setHost("ASUS Host");
    }
    @Override
    void buildScreen() {
        computer.setScreen("ASUS Screen");
    }
    @Override
    void buildMouse() {
        computer.setMouse("ASUS Mouse");
    }
    @Override
    void buildKeyBoard() {
        computer.setKeyBoard("ASUS KeyBoard");
    }
    @Override
    Computer createComputer() {
        return computer;
    }
}
复制代码

Director.java

/**
 * @desc: Director角色
 * @author: YanMingXin
 * @create: 2021/8/19-16:13
 **/
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    public Computer construct() {
        builder.buildHost();
        builder.buildKeyBoard();
        builder.buildMouse();
        builder.buildScreen();
        return builder.createComputer();
    }
}
复制代码

MyBuilder.java

/**
 * @desc: 建造指挥者
 * @author: YanMingXin
 * @create: 2021/8/19-14:21
 **/
public class MyBuilder {
    public static void main(String[] args) {
        Director director = new Director(new AppleComputerBuilder());
        Computer computer = director.construct();
        System.out.println(computer.toString());
    }
}
复制代码

测试结果:

网络异常,图片无法展示
|


3.2 案例2

场景:

一个实体类有多种属性,但是有的是必要的,有的是不必要的,在某些场景下需要的属性都不尽相同,因此当一个实体类的构造方法大于3个时,我们就要考虑使用建造者模式来改造下实体类,具体的方法就是将类的构造方法设置参数为Builder,并内置一个静态内部类为Builder,将实体类的属性全部给Builder类,将Builder类的参数全部在实体类的构造方法中赋值给类的属性下面是具体的演示:

代码:

Car.java

/**
 * @desc: 实体类
 * @author: YanMingXin
 * @create: 2021/8/19-16:22
 **/
public class Car {
    private String name;
    private Double price;
    private String tyre;
    private String body;
    private String windows;
    public Car() {
    }
    public Car(Builder builder) {
        this.name = builder.name;
        this.price = builder.price;
        this.tyre = builder.tyre;
        this.body = builder.body;
        this.windows = builder.windows;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    public String getTyre() {
        return tyre;
    }
    public void setTyre(String tyre) {
        this.tyre = tyre;
    }
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public String getWindows() {
        return windows;
    }
    public void setWindows(String windows) {
        this.windows = windows;
    }
    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", tyre='" + tyre + '\'' +
                ", body='" + body + '\'' +
                ", windows='" + windows + '\'' +
                '}';
    }
    /**
     * 建造器
     */
    static class Builder {
        private String name;
        private Double price;
        private String tyre;
        private String body;
        private String windows;
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setPrice(Double price) {
            this.price = price;
            return this;
        }
        public Builder setTyre(String tyre) {
            this.tyre = tyre;
            return this;
        }
        public Builder setBody(String body) {
            this.body = body;
            return this;
        }
        public Builder setWindows(String windows) {
            this.windows = windows;
            return this;
        }
        public Car build() {
            return new Car(this);
        }
    }
}
复制代码

MyBuilder.java

/**
 * @desc: 测试类
 * @author: YanMingXin
 * @create: 2021/8/19-16:21
 **/
public class MyBuilder {
    public static void main(String[] args) {
        Car car = new Car.Builder()
                .setBody("s")
                .setName("B")
                .setPrice(1243.3)
                .build();
        System.out.println(car);
    }
}
复制代码

测试结果:


网络异常,图片无法展示
|


相关文章
|
16天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8334 19
|
15天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2643 14
|
15天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1935 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
13天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)
|
9天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
9天前
|
人工智能 JSON 编解码
【2026最新版】ComfyUI本地部署教程,新手也能看懂!
ComfyUI是本地运行的AI绘画工具,采用节点式工作流设计:通过拖拽连接“加载模型”“提示词编码”“采样”“解码”等模块,实现高度可控的文生图。新手推荐使用秋叶整合包,一键启动、内置模型管理与插件安装器,轻松上手。(239字)
|
23天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
2516 1

热门文章

最新文章