当前位置: 首页 > news >正文

设计模式探索:建造者模式

1. 什么是建造者模式

建造者模式 (Builder Pattern),也被称为生成器模式,是一种创建型设计模式。

  • 定义:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式要解决的问题:

  • 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部的具体构造细节。
    在这里插入图片描述

2. 建造者模式的结构

在这里插入图片描述

建造者(Builder)模式包含以下4个角色:

  1. 抽象建造者类(Builder):规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建。
  2. 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供一个方法,返回创建好的复杂产品对象。
  3. 产品类(Product):要创建的复杂对象 (包含多个组成部件)。
  4. 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指挥者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建(客户端一般只需要与指挥者进行交互)。

3. 代码示例

下面是一个SQL查询生成器的例子,展示如何使用建造者模式生成不同数据库的SQL查询语句。

产品类
public class SqlQuery {private String select;private String from;private String where;private String groupBy;private String orderBy;private String limit;public SqlQuery(String select, String from) {this.select = select;this.from = from;}// Getters and setters@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("SELECT ").append(select).append(" FROM ").append(from);if (where != null && !where.isEmpty()) {sb.append(" WHERE ").append(where);}if (groupBy != null && !groupBy.isEmpty()) {sb.append(" GROUP BY ").append(groupBy);}if (orderBy != null && !orderBy.isEmpty()) {sb.append(" ORDER BY ").append(orderBy);}if (limit != null && !limit.isEmpty()) {sb.append(" LIMIT ").append(limit);}return sb.toString();}
}

抽象建造者

public abstract class SqlQueryBuilder {protected SqlQuery sqlQuery;public void createSqlQuery(String select, String from) {sqlQuery = new SqlQuery(select, from);}public SqlQuery getSqlQuery() {return sqlQuery;}public abstract void buildWhere();public abstract void buildGroupBy();public abstract void buildOrderBy();public abstract void buildLimit();
}

具体建造者

public class MySqlQueryBuilder extends SqlQueryBuilder {@Overridepublic void buildWhere() {sqlQuery.setWhere("1 = 1"); // MySQL不需要限制行数}@Overridepublic void buildGroupBy() {sqlQuery.setGroupBy("deptno, ename, hiredate");}@Overridepublic void buildOrderBy() {sqlQuery.setOrderBy("hiredate DESC");}@Overridepublic void buildLimit() {sqlQuery.setLimit("0, 10"); // MySQL分页从0开始}
}public class OracleQueryBuilder extends SqlQueryBuilder {@Overridepublic void buildWhere() {sqlQuery.setWhere("rownum <= 1000"); // Oracle查询最多返回1000行数据}@Overridepublic void buildGroupBy() {sqlQuery.setGroupBy("deptno, ename, hiredate");sqlQuery.setSelect(sqlQuery.getSelect() + ", deptno, ename, hiredate");}@Overridepublic void buildOrderBy() {sqlQuery.setOrderBy("hiredate");}@Overridepublic void buildLimit() {sqlQuery.setLimit("10");}
}

指挥者类

public class SqlQueryDirector {private SqlQueryBuilder sqlQueryBuilder;public void setSqlQueryBuilder(SqlQueryBuilder sqlQueryBuilder) {this.sqlQueryBuilder = sqlQueryBuilder;}public void buildSqlQuery(String select, String from) {sqlQueryBuilder.createSqlQuery(select, from);sqlQueryBuilder.buildWhere();sqlQueryBuilder.buildGroupBy();sqlQueryBuilder.buildOrderBy();sqlQueryBuilder.buildLimit();}
}

客户端

public class Client {public static void main(String[] args) {// 创建MySQL建造者SqlQueryBuilder mySqlQueryBuilder = new MySqlQueryBuilder();// 创建Oracle建造者SqlQueryBuilder oracleQueryBuilder = new OracleQueryBuilder();// 指导者SqlQueryDirector sqlQueryDirector = new SqlQueryDirector();// 构建MySQL查询语句sqlQueryDirector.setSqlQueryBuilder(mySqlQueryBuilder);sqlQueryDirector.buildSqlQuery("*", "table1");SqlQuery mySqlQuery = mySqlQueryBuilder.getSqlQuery();System.out.println("MySQL Query: " + mySqlQuery);// 构建Oracle查询语句sqlQueryDirector.setSqlQueryBuilder(oracleQueryBuilder);sqlQueryDirector.buildSqlQuery("*", "table2");SqlQuery oracleQuery = oracleQueryBuilder.getSqlQuery();System.out.println("Oracle Query: " + oracleQuery);}
}

4. 建造者模式在实际开发中的应用

建造者模式在实际开发中的应用主要体现在以下几个方面:

  1. 复杂对象的创建:例如,在创建一个复杂对象时,如果这个对象有很多可选参数,使用建造者模式可以避免构造函数参数列表过长的问题。
  2. 多步骤创建过程:例如,在构建SQL查询、创建报告等需要多个步骤的过程中,使用建造者模式可以将这些步骤分离出来,使得代码更易于维护和扩展。
  3. 对象的不变性:例如,创建一个不可变对象时,可以使用建造者模式来确保对象在创建后不被修改。

5. 建造者模式与工厂模式的区别

  1. 工厂模式

    • 用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
    • 主要关注的是创建单个对象。
      在这里插入图片描述
  2. 建造者模式

    • 用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。
    • 主要关注的是如何一步一步创建一个复杂的对象。
    • 更强调创建过程的分步和顺序。
      在这里插入图片描述

总之,建造者模式可以很好地解决创建复杂对象时的代码复用性和可维护性问题,而工厂模式则更加适用于创建一组相关的对象。

相关文章:

设计模式探索:建造者模式

1. 什么是建造者模式 建造者模式 (Builder Pattern)&#xff0c;也被称为生成器模式&#xff0c;是一种创建型设计模式。 定义&#xff1a;将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 建造者模式要解决的问题&#xff1a; 建造者模…...

[Go] 字符串遍历数据类型问题

字符串遍历问题 在使用for i,v:range str遍历字符串时 str[i]是unit8&#xff08;byte&#xff09;类型&#xff0c;返回的是单个字节 字符串在Go中是以字节序列的形式存储的&#xff0c;而 str[i] 直接访问了这个字节序列中的第 i 个字节。如果字符串中的字符是单字节的ASCII…...

HJ41 称砝码

HJ41 称砝码 提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 这个题目之前是没有做出来的&#xff0c;我把之前没做出来的代码也记录一下 二、 2.1 之前的代码 #include <stdio.h>int m…...

如何使用Python脚本实现SSH登录

调试IDE&#xff1a;PyCharm Python库&#xff1a;Paramiko 首先安装Paramiko包到PyCharm&#xff0c;具体步骤为&#xff1a;在打开的PyCharm工具中&#xff0c;选择顶部菜单栏中“File”下的“Settings”&#xff0c;在设置对话框中&#xff0c;选择“Project”下的“Proje…...

2024年文化研究与数字媒体国际会议 (CRDM 2024)

2024年文化研究与数字媒体国际会议 (CRDM 2024) 2024 International Conference on Cultural Research and Digital Media 【重要信息】 大会地点&#xff1a;珠海 大会官网&#xff1a;http://www.iccrdm.com 投稿邮箱&#xff1a;iccrdmsub-conf.com 【注意&#xff1a;稿将…...

14-52 剑和诗人26 - RAG 和 VectorDB 简介

检索增强生成 (RAG) 和 VectorDB 是自然语言处理 (NLP) 中的两个重要概念&#xff0c;它们正在突破 AI 系统所能实现的界限。 在这篇博文中&#xff0c;我将深入探讨 RAG&#xff0c;探索其工作原理、应用、优势和局限性。 我们还将研究 VectorDB&#xff0c;这是一种专用于向…...

如果MySQL出现 “Too many connections“ 错误,该如何解决?

当你想要连接MySQL时出现"Too many connections" 报错的情况下&#xff0c;该如何解决才能如愿以偿呢&#xff1f;都是哥们儿&#xff0c;就教你两招吧&#xff01; 1.不想重启数据库的情况下 你可以尝试采取以下方法来解决&#xff1a; 增加连接数限制&#xff1a…...

论文阅读:Rethinking Interpretability in the Era of Large Language Models

Rethinking Interpretability in the Era of Large Language Models 《Rethinking Interpretability in the Era of Large Language Models》由Chandan Singh、Jeevana Priya Inala、Michel Galley、Rich Caruana和Jianfeng Gao撰写&#xff0c;探讨了在大型语言模型&#xff…...

C++/Qt 信号槽机制详解

文章目录 C++/Qt 信号槽机制详解一、信号和槽的基本概念1. 信号2. 槽3. 连接二、信号和槽的基本使用1. 信号和槽的声明和定义2. 连接信号和槽三、信号和槽的工作原理1. MOC(Meta-Object Compiler)2. 事件循环3. 连接类型四、信号和槽的高级应用1. 自定义信号和槽2. Lambda 表…...

duplicate key value violates unique constraint

duplicate key value violates unique constraint 遇到的问题 你在尝试向数据库表 goods 插入新记录时&#xff0c;收到了 duplicate key value violates unique constraint 的错误。尽管你确认数据库中没有与尝试插入的 id 相同的记录&#xff0c;但错误依旧存在。进一步的调…...

YOLOv10改进 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv10的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…...

docker nginx mysql redis

启动没有数据卷的nginx docker run -d -p 86:80 --name my-nginx nginx把/etc/nginx中的配置复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl把/html 中的文件复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl删除当前镜像 docker rm -f my-nginx重新起…...

Linux系统(CentOS)安装iptables防火墙

1&#xff0c;先检查是否安装了iptables 检查安装文件-执行命令&#xff1a;rpm -qa|grep iptables 检查安装文件-执行命令&#xff1a;service iptables status 2&#xff0c;如果安装了就卸装(iptables-1.4.21-35.el7.x86_64 是上面命令查出来的版本) 执行命令&#xff1a…...

华为的服务器创新之路

华为作为全球领先的信息与通信技术解决方案供应商&#xff0c;其在服务器领域的创新方法不仅推动了企业自身的发展&#xff0c;也为整个行业的进步做出了重要贡献。以下是华为在服务器领域所采取的一些关键创新方法&#xff1a; 芯片级的自主创新 华为通过自主研发的“鲲鹏”处…...

对比service now和salesforce

目录 1. 核心功能和用途 2. 市场定位 3. 平台和扩展性 4. 用户界面和用户体验 5. 价格 总结 ServiceNow和Salesforce是两款广泛使用的企业软件平台&#xff0c;但它们的侧重点和用途有所不同。以下是对它们的详细比较&#xff1a; 1. 核心功能和用途 ServiceNow IT服务…...

树状数组

树状数组 树状数组的核心思想&#xff1a;分治。将数组以二叉树的形式进行维护区间之和。 设 a a a为原数组&#xff0c; t r e e tree tree为树状数组。 t r e e tree tree数组用于存储树上该结点下严格直连的子节点之和(例&#xff1a; t [ 1 ] a [ 1 ] , t [ 2 ] t [ 1 …...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

ansible常见问题配置好了密码还是报错

| FAILED! > { “msg”: “Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host’s fingerprint to your known_hosts file to manage this host.” } 怎么解决&#xf…...

python-课程满意度计算(赛氪OJ)

[题目描述] 某个班主任对学生们学习的的课程做了一个满意度调查&#xff0c;一共在班级内抽取了 N 个同学&#xff0c;对本学期的 M 种课程进行满意度调查。他想知道&#xff0c;有多少门课是被所有调查到的同学都喜欢的。输入格式&#xff1a; 第一行输入两个整数 N , M 。 接…...

6、Redis系统-数据结构-05-整数

五、整数集合&#xff08;Intset&#xff09; 整数集合是 Redis 中 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。整数集合通过紧凑的内存布局和升级机制&#xff0c;实现了…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...