23种设计模式-生成器(Builder)设计模式

news2025/3/26 10:54:33

工厂方法设计模式

  • 🚩什么是生成器设计模式?
  • 🚩生成器设计模式的特点
  • 🚩生成器设计模式的结构
  • 🚩生成器设计模式的优缺点
  • 🚩生成器设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是生成器设计模式?

生成器模式(Builder Pattern) 是一种 创建型设计模式,用于构建复杂对象,并且能够一步步地构造对象,而无需直接使用构造函数传递大量参数。

在 Java 中,如果一个类有多个可选参数,传统方式是使用 重载构造函数Setter 方法,但这样会导致代码冗长且不易维护。

生成器模式 通过 链式调用方法返回当前对象 的方式,使代码更加清晰易读。

🚩生成器设计模式的特点

  • 支持链式调用:可以连续调用方法来设置属性,使代码更优雅。
  • 构造过程更清晰:将对象的创建步骤封装到生成器中,避免构造函数参数过多的问题。
  • 提高可读性和可维护性:使用生成器模式可以避免复杂的构造函数重载,提高代码可读性。
  • 可以对对象创建过程进行控制:如可以添加 参数校验默认值对象克隆 等操作。

🚩生成器设计模式的结构

生成器模式通常包含以下几个部分:

  • Product(产品类):要构建的复杂对象。
  • Builder(抽象生成器):定义构建对象的步骤。
  • ConcreteBuilder(具体生成器):实现 Builder 接口,并定义如何创建 Product 对象。

🚩生成器设计模式的优缺点

✅ 优点

  • 避免构造方法参数过多的问题,提供更优雅的对象创建方式。
  • 可以设置默认值,构造对象时不必提供所有参数。
  • 可读性强,通过链式调用,使代码更直观。
  • 解耦对象构建和表示,使代码更容易扩展和维护。

❌ 缺点

  • 增加代码复杂度:需要额外定义 Builder 类,代码量比直接使用构造函数多。
  • 对象构造过程比普通方法慢,因为涉及多个方法调用。

🚩生成器设计模式的Java实现

代码地址:GitHub

  • 创建一个产品类Product
/**
 * @author hanson
 * @description: 定义产品类
 * @date 2025-03-23 21:08:03
 * @version: 1.0
 */
public class Product {

    List<String> parts = new ArrayList<String>();

    public void Add(String part) {
        parts.add(part);
    }

    public void show() {
        System.out.println("产品的组成:");
        for (String part : parts) {
            System.out.println(part + " ");
        }
        System.out.println("\n");
    }
}
  • 创建一个抽象建造者类,里面有两个抽象方法,用于构建产品和打印结果
/**
 * @author hanson
 * @description: 生成器(Builder 类)
 * @date 2025-03-23 21:10:30
 * @version: 1.0
 */
public abstract class Builder {

    public abstract void BuildPart();

    public abstract Product getResult();
}
  • 创建两个构造器不通的实现类,用于构建不同的产品

    • 具体构造器Builder1
    /**
     * @author hanson
     * @description: 具体构建者1
     * @date 2025-03-23 21:17:56
     * @version: 1.0
     */
    public class Builder1 extends Builder{
    
        Product product = new Product();
    
        @Override
        public void BuildPart() {
            product.Add("A");
            product.Add("B");
            product.Add("C");
            product.Add("D");
            product.Add("E");
            product.Add("F");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
    • 具体构造器Builder2
    /**
     * @author hanson
     * @description: 具体构建者2
     * @date 2025-03-23 21:19:00
     * @version: 1.0
     */
    public class Builder2 extends Builder{
    
        Product product = new Product();
    
        @Override
        public void BuildPart() {
            product.Add("A");
            product.Add("B");
            product.Add("C");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
  • 创建一个指挥Director用于负责Builder 创建

/**
 * @author hanson
 * @description: 指挥者 负责组织 Builder 的构建过程。
 * @date 2025-03-23 21:16:35
 * @version: 1.0
 */
public class Director {

    public void Construct(Builder builder){
        builder.BuildPart();
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Director(指挥者) 负责组织 Builder 的构建过程。
  • Builder(抽象构造者) 规定了 BuildPart()getResult() 方法。
  • Builder1 和 Builder2(具体构造者) 提供不同的 Product 实现方式。
  • Product(产品类) 通过 List<String> 存储构造的部分,并在 show() 方法中打印结果。

🚩总结

  • 生成器模式(Builder Pattern)创建型设计模式,用于构建 复杂对象
  • 分离了对象的创建和表示,提高了 代码可读性可维护性
  • 适用于 多个可选参数 的对象构造,避免构造方法重载的困扰。
  • 在 Java 中,常见于 StringBuilderLombok @BuilderJackson ObjectMapper 等应用。

✅ 适用场景:

  • 需要创建 包含多个参数 的复杂对象。
  • 需要构建 不可变对象
  • 希望提供更清晰的 API,提高代码可读性。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

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

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

相关文章

蓝桥杯备考:BFS最短路径之Meteor Shower S流星雨

本题是一个BFS最短路问题&#xff0c;我们可以先把时刻的矩阵搞出来&#xff0c;哪些时刻哪些方块儿不能走用来剪枝 如果第一次走到永远不会被扎到的区域&#xff0c;那时候就是我们的最短距离 定义方向向量 #include <iostream> #include <queue> #include <c…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整活…

数据结构5(初):排序

目录 1、排序的概念以及常见的排序算法 1.1、排序的概念 1.2、常见的排序算法 2、常见排序算法的实现 2.1、插入排序 2.1.1、直接插入排序 2.1.2、希尔排序 2.2、选择排序 2.2.1、直接选择排序 2.2.2、堆排序 2.3、交换排序 2.3.1、冒泡排序 2.3.2、快速排序 2.3.…

2025-03-23 学习记录--C/C++-C语言 sprintf()实现将多个值按指定格式拼接成字符串

C语言 sprintf()实现将多个值按指定格式拼接成字符串 举个例子 &#x1f330;&#xff1a;将字符串 “m” 与数字 0、1、2 动态拼接成 “m0”、“m1”、“m2”&#xff1a;&#x1f447;&#x1f3fb; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用输入…

【小程序开发】完整项目结构长啥样?

Hello,欢迎来到AI技术库。AI写代码的时代,人人都可以成为程序员。欢迎继续【小程序开发】系列课。上节课中,我们学习了【手把手教你小程序开发】什么是大前端?,本节课,我们学习第二篇 小程序的完整项目结构。 本文适合阅读对象: 1. 非计算机专业AI爱好者;2. 小程序开发…

计算机网络精讲day2———计算机网络的性能指标(下)

性能指标5&#xff1a;时延带宽积 时延带宽积传播时延*带宽 这里要注意是传播时延不是发送时延 重点&#xff1a;管道法解析时延带宽积 我们以一个圆柱形管道来代表链路&#xff0c;管道的长度是链路的传播时延&#xff08;以时间作为单位单位表示链路长度&#xff09;&#x…

【多线程】初始线程和Thread类

一. 线程 1. 线程的引入 虽然进程已经可以解决并发编程这种问题&#xff0c;但是进程在频繁进行创建和销毁的时候&#xff0c;系统开销非常大&#xff0c;如果一个服务器向你发送多个请求&#xff0c;针对每一个请求&#xff0c;都需要创建一个进程来应答&#xff0c;每个进程…

WebLogic中间件常见漏洞

一、后台弱⼝令GetShell 1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.访问网站并登陆后台 /console/login/LoginForm.jsp 默认账号密码&#xff1a;weblogic/Oracle123 3.点击部署&#xff0c;点击安装&#xff…

[笔记.AI]多头自注意力机制(Multi-Head Attention)

多头自注意力是深度学习领域&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;和Transformer模型中的关键概念。其发展源于对序列数据中复杂依赖关系的建模需求&#xff0c;特别是在Transformer架构的背景下。 举例 比喻-读长篇文章 用一个简单的比喻来理解“多头注…

【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python

### 记录一下使用Python实现ROS平台A*算法路径规划 ### 代码可自取 &#xff1a;Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目录 一、思路分析 二、算法实现 三、路径规划实现 一、思路分析 要求使用A*算法实现路径规划&#xff0c;可以将该任务分为三…

keda基于postgresql伸缩dify-api服务

1 概述 dify-api使用postgresql来存储数据&#xff0c;在dify控制台每新建一个聊天机器的聊天框&#xff0c;就会在conversations表里新插入一条记录&#xff0c;并且不断地更新字段updated_at&#xff0c;示例如下&#xff1a; dify# select * from conversations limit 1; …

趣味极简品牌海报艺术贴纸设计圆润边缘无衬线粗体装饰字体 Chunko Bold - Sans Serif Font

Chunko Bold 是一种功能强大的显示字体&#xff0c;体现了大胆极简主义的原则 – 当代设计的主流趋势。这种自信的字体将粗犷的几何形状与现代的趣味性相结合&#xff0c;具有圆润的边缘和强烈的存在感&#xff0c;与当今的极简主义设计方法完美契合。无论是用于鲜明的构图还是…

指针,数组 易混题解析(一)

目录 一.相关知识点 1.数组名是什么&#xff1f; 两个例外&#xff1a; 2.strlen 3.sizeof 4. * ( ) 与 [ ] 的互换 二.一维数组 三.字符数组 1. 字符 &#xff08;1&#xff09;sizeof &#xff08;2&#xff09;strlen 2.字符串 &#xff08;1&#xff09;si…

2025前端面试题记录

vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…

复变函数摘记2

复变函数摘记2 3. 级数3.1 复数项级数3.2 复变幂级数3.3 泰勒级数3.4 洛朗级数 3. 级数 \quad 复数项级数的一般项 α n a n i b n \alpha_na_n\text{i}b_n αn​an​ibn​ 为复数&#xff0c;与高等数学中无穷级数的分析方式类似&#xff0c;也是通过和函数来研究级数的收敛…

高频面试题(含笔试高频算法整理)基本总结回顾67

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

Kafka--常见问题

1.为什么要使用 Kafka&#xff0c;起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统&#xff0c;它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输&#xff0c;每秒可以处理数百万条消息。它能够在处理大量并发请求时&#xff0c;保持低延迟和…

优选算法的睿智之林:前缀和专题(一)

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…

【清华大学】AIGC发展研究(3.0版)

目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容&#xff08;一&#xff09;文本生成&#xff08;二&#xff09;图像生成&#xff08;三&#xff09;音乐生成&#xff08;四&#xff09;视频生成 五、各行业应用六、未来展望 AIGC发展研究…

JavaSE1.0(基础语法之运算符)

算术运算符 基础运算之加 减 乘 除 取余&#xff08; - * / %&#xff09; 运算符之相加&#xff08; &#xff09; public static void main(String[] args) {System.out.println("Hello world!");int a 10;int b 20;int c a b;System.out.println(c);//…