【设计模式系列】建造者模式(十)

news2024/12/29 14:52:51

目录

一、什么是建造者模式

二、建造者模式的角色

三、建造者模式的典型应用

四、建造者模式在StringBuilder中的应用

五、典型建造者模式的案例


一、什么是建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。

二、建造者模式的角色

  1. Product(产品角色):Product是最终要构建的复杂对象的类。它定义了产品的属性和行为,但不包含构建逻辑。

  2. Builder(抽象建造者):Builder是一个接口或抽象类,它声明了用于构建Product对象的各个步骤的方法。这些方法通常返回Builder对象本身,以支持链式调用。其中Builder类不实现具体的构建逻辑,而是在具体的建造者类中实现。

  3. ConcreteBuilder(具体建造者):ConcreteBuilder实现了Builder接口,并提供了构建Product对象的具体逻辑。它负责创建Product的实例,并根据Builder接口中定义的方法来组装产品。

  4. Director(指挥者)(可选):Director类负责管理构建过程,它接受一个Builder对象,并使用该对象的构建方法来创建一个Product对象。Director类使得构建过程与客户端代码解耦。

三、建造者模式的典型应用

  1. 复杂对象的构建: 建造者模式允许逐步构建复杂对象,特别适用于创建具有许多配置选项的对象。例如,在Java核心库中,StringBuilderStringBufferappend() 方法就是建造者模式的典型应用,它们允许动态地构建字符串。

  2. 不同表现形式的产品构建: 当需要创建不同表现形式的产品时,可以使用建造者模式。例如,可以同时构建纸质和电子版手册,尽管这两种产品不遵循相同的接口,但可以使用相同的构建步骤。

四、建造者模式在StringBuilder中的应用

在Java中,StringBuilder类并没有直接使用建造者模式,但我们可以类比理解。StringBuilder提供了一种可变的字符序列,它允许我们通过链式调用来构建字符串。虽然StringBuilder不是通过建造者模式构建的,但它提供了一种类似建造者模式的接口风格,允许我们逐步构建字符串。

如果我们想要模拟建造者模式在StringBuilder中的应用,可以创建一个StringBuilderBuilder类,它包含一个StringBuilder对象,并提供一系列方法来构建字符串,如下所示:

public class StringBuilderBuilder {
    private StringBuilder stringBuilder;

    public StringBuilderBuilder() {
        this.stringBuilder = new StringBuilder();
    }

    public StringBuilderBuilder append(String str) {
        this.stringBuilder.append(str);
        return this; // 返回自身以支持链式调用
    }

    public StringBuilderBuilder append(int value) {
        this.stringBuilder.append(value);
        return this;
    }

    public StringBuilderBuilder append(char value) {
        this.stringBuilder.append(value);
        return this;
    }

    // 更多的append方法...

    public String build() {
        return this.stringBuilder.toString();
    }
}

// 使用
StringBuilderBuilder builder = new StringBuilderBuilder();
String result = builder.append("Hello").append(" ").append("World").build();

在这个例子中,StringBuilderBuilder类扮演了建造者的角色,它提供了一系列的append方法来逐步构建字符串,并最终通过build方法返回构建好的字符串。这种方式使得字符串的构建过程更加清晰和灵活。

五、典型建造者模式的案例

1. 定义产品类(Product)

public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.memory = builder.memory;
        this.hardDisk = builder.hardDisk;
    }

    public void assemble() {
        System.out.println("Assembling computer with CPU: " + cpu + ", Memory: " + memory + ", Hard Disk: " + hardDisk);
    }

    public static class Builder {
        private String cpu;
        private String memory;
        private String hardDisk;

        public Builder setCPU(String cpu) {
            this.cpu = cpu;
            return this;
        }

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

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

        public Computer build() {
            return new Computer(this);
        }
    }
}

2. 定义指挥者类(Director)

public class ComputerDirector {
    private Computer.Builder builder;

    public ComputerDirector(Computer.Builder builder) {
        this.builder = builder;
    }

    public Computer construct() {
        builder.setCPU("Intel i7");
        builder.setMemory("16GB");
        builder.setHardDisk("1TB");
        return builder.build();
    }
}

3. 使用建造者模式和指挥者构建对象

public class Client {
    public static void main(String[] args) {
        // 创建具体的建造者对象
        Computer.Builder builder = new Computer.Builder();
        // 创建指挥者对象,并传入建造者对象
        ComputerDirector director = new ComputerDirector(builder);
        // 使用指挥者对象指导构建过程
        Computer computer = director.construct();
        // 组装电脑
        computer.assemble();
    }
}
  • Computer:产品类,包含三个属性:CPU、内存和硬盘。构造函数是私有的,只能通过内部的 Builder 类来创建对象。
  • BuilderComputer 的内部静态类,实现了建造者模式。提供了 setCPUsetMemory 和 setHardDisk 方法来设置 Computer 的属性,并返回 Builder 对象本身以支持链式调用。build 方法用于创建 Computer 对象。
  • ComputerDirector:指挥者类,它接受一个 Computer.Builder 对象,并使用该对象的构建方法来创建一个 Computer 对象。construct 方法定义了构建 Computer 对象的步骤。
  • Client:客户端代码创建 Computer.Builder 对象,然后创建 ComputerDirector 对象并传入 Builder 对象。客户端使用 ComputerDirector 的 construct 方法来指导构建过程,并最终组装电脑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用vite创建项目

一. vite vue2 1. 全局安装 create-vite npm install -g create-vite 2. 创建项目 进入你想要创建项目的文件夹下 打开 CMD 用 JavaScript create-vite my-vue2-project --template vue 若用 TypeScript 则 create-vite my-vue2-project --template vue-ts 这里的 …

JVM结构图

JVM(Java虚拟机)是Java编程语言的核心组件之一,负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成,包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统(Class Loading Subsy…

WordPress伪静态设置

为什么要设置WordPress伪静态,搜索引擎优化(SEO)中,静态URL通常被认为更易于搜索引擎爬虫抓取和索引,有助于提高网站的搜索引擎排名。 WordPress伪静态设置方法主要依赖于服务器环境,以下是针对不同服务器…

【黑盒测试】等价类划分法及实例

本文主要介绍黑盒测试之等价类划分法,如什么是等价类划分法,以及如何划分,设计等价类表。以及关于三角形案例的等价类划分法。 文章目录 一、什么是等价类划分法 二、划分等价类和列出等价类表 三、确定等价类的原则 四、建立等价类表 …

宠物领养救助管理软件有哪些功能 佳易王宠物领养救助管理系统使用操作教程

一、概述 佳易王宠物领养救助管理系统V16.0,集宠物信息登记、查询,宠物领养登记、查询, 宠物领养预约管理、货品进出库库存管理于一体的综合管理系统软件。 概述: 佳易王宠物领养救助管理系统V16.0,集宠物信息登记…

RK3568开发板静态IP地址配置

1. 连接SSH MYD-LR3568 开发板设置了静态 eth0:1 192.168.0.10 和 eth1:1 192.168.1.10,在没有串口时调试开发板,可以用工具 SSH 登陆到开发板。 首先需要用一根网线直连电脑和开发板,或者通过路由器连接到开发板,将电脑 IP 手动设…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能,我使用了flutter_reactive_ble这个库,但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

【含开题报告+文档+源码】基于Java的房屋租赁服务系统设计与实现

开题报告 随着城市化进程的加速和人口流动性的增加,租房需求不断增长。传统的租赁方式往往存在信息不对称、流程不规范等问题,使得租户和房东的租赁体验不佳。而而房屋租赁系统能够提供便捷、高效的租赁服务,满足租户和房东的需求。房屋租赁…

斯托克斯矢量,表示电磁波的(不是散射体)平均后,可分解为完全极化电磁波和噪声

可见完全极化分就表示只有一种,在T矩阵中是只有一种散射体,在电磁波协方差矩阵中是只有一种电磁波

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

大腾智能荣获盐田区黄金珠宝产业“产业赋能数字化优选能力伙伴”荣誉

11月2日,盐田区黄金珠宝产业数智化转型促进中心(简称“促进中心”)揭牌仪式圆满举办。盐田区委书记李忠,市工业和信息化局、市市场监督管理局、华为技术有限公司等相关单位、企业负责人共同见证促进中心揭牌启动。 大腾智能也出席…

10天进阶webpack---(2)webpack模块兼容性处理

回顾CMJ和ESM的区别 CMJ的本质可以使用一个函数概括 // require函数的伪代码 function require(path){if(该模块有缓存吗){return 缓存结果;}function _run(exports, require, module, __filename, __dirname){// 模块代码会放到这里}var module {exports: {}}_run.call(mod…

034_Structural_Transient_In_Matlab结构动力学问题求解

结构动态问题 问题描述 我们试着给前面已经做过的问题上加一点有趣的东西。 结构静力学求解 当时求解这个问题,在最外面的竖直切面加载了一个静态的固定的力。下面我们试试看在上方的表面增加一个脉冲压力载荷。 采用统一的有限元框架,定义问题&…

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档,我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…

TortoiseSVN小乌龟下载安装(Windows11)

目录 TortoiseSVN 1.14.7工具下载安装 TortoiseSVN 1.14.7 工具 系统:Windows 11 下载 官网:https://tortoisesvn.subversion.org.cn/downloads.html如图选 TortoiseSVN 1.14.7 - 64 位 下载完成 安装 打开 next,next Browse&#xf…

Python实例:爱心代码

前言 在编程的奇妙世界里,代码不仅仅是冰冷的指令集合,它还可以成为表达情感、传递温暖的独特方式。今天,我们将一同探索用 Python 语言绘制爱心的神奇之旅。 爱心,这个象征着爱与温暖的符号,一直以来都在人类的情感世界中占据着特殊的地位。而通过 Python 的强大功能,…

ENSP RIP动态路由

RIP(距离矢量路由协议)以网络中所有链路的距离和矢量为依据计算最佳路径,是第一个动态路由协议。条数作为唯一的度量单位。默认开启水平分割(从一个路由接口学到的路由信息,便不在从这个接口发送出去)防止路…

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…

C++——priority_queue模拟实现过程中的优化

前言的前言&#xff1a; 大佬写博客给别人看&#xff0c;菜鸟写博客给自己看&#xff0c;我是菜鸟。 前言&#xff1a; 1.priority_queue&#xff08;优先队列&#xff09;的底层原理和堆极其相似&#xff0c;因此在模拟实现的过程中&#xff0c;主要借助堆的思想取完成&…

蓝桥杯真题——三角回文数(C语言)

问题描述 对于正整数 n, 如果存在正整数 k 使得 n123⋯kk(k1)2n123⋯kk(k1)/2​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯36366066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数…