【设计模式】-建造者模式

Java建造者模式:创建复杂对象的灵活构建者

在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder  Pattern)通过引入建造者对象来逐步构建复杂对象,使得对象的构建过程更加灵活、可控,同时还能提供更好的代码可读性和维护性。

一、原理

建造者模式的核心思想是将一个复杂对象的构建过程它的表示分离,使得同样的构建过程可以创建不同的表示。具体来说,建造者模式通过将对象的构建过程委派给不同的建造者类,每个建造者类都负责创建对象的一部分,并最终将这些部分组装成完整的对象。

它由四个主要的角色组成:产品类(Product)抽象建造者类(Builder)具体建造者类(ConcreteBuilder)指导者类(Director)

  • 产品类(Product):表示最终构建的对象。该类具有一些属性,可以通过设置相应的setter方法进行赋值,并且定义了一个展示产品的方法。
  • 抽象建造者类(Builder):定义了产品构建的抽象方法。包括构建不同部分的方法和获取最终产品的方法,由具体建造者类来实现。
  • 具体建造者类(ConcreteBuilder):继承自抽象建造者类,实现了具体的构建过程。包括构建不同部分和获取最终产品的方法。
  • 指导者类(Director):负责使用具体的建造者类来构建产品。通过调用具体建造者的方法来完成产品的构造,并最终返回一个完整的产品对象。

产品类

public class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    public void show() {
        System.out.println("Product: " + partA + ", " + partB + ", " + partC);
    }
}

抽象建造者类

public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    public abstract Product buildProduct();
}

具体建造者类

public class ConcreteBuilder extends Builder {
   private Product product = new Product();

    @Override
    public void buildPartA() {
        product.setPartA("生产线1>>>-------->产品A");
    }

    @Override
    public void buildPartB() {
        product.setPartB("生产线1>>>-------->产品B");
    }

    @Override
    public void buildPartC() {
        product.setPartC("生产线1>>>-------->产品C");
    }

    @Override
    public Product buildProduct() {
        return product;
    }
}

指导者类

public class Director {
   public Builder construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder;
    }
}

测试

public class Client {
    public static void main(String[] args) {
        // 指导者
        Director director = new Director();
        // 生产线1
        Builder construct = director.construct(new ConcreteBuilder());
        Product product = construct.buildProduct();

        // 显示生产了什么产品
        product.show();
    }
}

运行结果如下:

 观察代码,可以发现建造者模式的流程如下:

  1. 第一步,创建指导者(Director)对象具体建造者(ConcreteBuilder)对象来开始构建创建过程。
  2. 第二步,指导者(Director)对象根据具体的建造者类完成建造过程,调用具体建造者的方法来构建产品的各个部分。也就是其方法中的builder.buildPartA();  builder.buildPartB(); builder.buildPartC();
  3. 建造者将构建好的部分返回给指导者。
  4. 指导者最终返回一个完整的产品对象,供客户端使用。

也就说,Product这个类属性的创建,不由它自身来控制,而是由具体的指导者(Director)对象来控制

那这样感觉把一个对象的创建变得复杂化了,为什么这么做呢? 这么做有什么好处和坏处呢??

优点:

  • 可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示

  • 通过增加新的具体建造者类,可以轻松扩展和改变产品的建造过程,符合开闭原则。

  • 使用建造者模式可以隐藏产品的内部细节,对客户端来说只关心如何创建对象,而不需要关心具体的构建过程。

缺点:

  • 增加了类的数量,增加了代码的复杂性

  • 对于简单的对象,使用建造者模式可能会显得繁琐。如果一个对象就那么几个字段,且其字段的使用场景比较固定,再用建造者模式就很繁琐了,还不够费劲的呢...

适用场景

  • 需要创建的对象具有复杂的内部结构,创建过程需要多个步骤。

  • 需要创建的对象的属性之间有一定的依赖关系。

  • 需要创建的对象的表示有多种方式,可以通过建造者模式灵活配置建造过程,得到不同的表示结果。

总结

建造者模式通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。它可以帮助我们创建复杂的对象,并保证对象的构建过程可配置和可扩展。在实际应用中,建造者模式具有较高的灵活性和可扩展性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB 使用总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类: 机械式Lidar:TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar:不旋转 激光雷达的输出是点云,点云数据特点: 简单:x y z i (i为信号强度) 稀疏:7%&…

【肺炎分类数据集】数据量非常充足的新冠肺炎分类数据共享

一、肺炎数据集介绍🍉: 1.1 格式🎈 按照标准的格式分为了①训练集train(134138575198张),②验证集val(8816张),③测试集test(234390624张)&#…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

【项目 计网3】Socket介绍 4.9字节序 4.10字节序转换函数

文章目录 4.8 Socket介绍4.9字节序简介字节序举例 4.10字节序转换函数 4.8 Socket介绍 所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进…

VUE之JWT前后端分离认证,学生管理系统

参考资料: SpringBoot搭建教程 SpringCloud搭建教程 JWT视频教程 JWT官网 Vue视频教程 JWT视频参考资料、VUE视频资料,及前后端demo 特别有参考价值的JWT博客1 特别有参考价值的JWT博客2 cookie、localstorage和sessionStorage的区别1 cookie、localstorage和sessi…

总结七大排序!

排序总览 外部排序:依赖硬盘(外部存储器)进行的排序。对于数据集合的要求特别高,只能在特定场合下使用(比如一个省的高考成绩排序)。包括桶排序,基数排序,计数排序,都是o…

【数据库】将excel数据导入mysql数据库

环境:Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件,删除表头行并另存为并更改编码方式(由于与数据库的编码不同,会导致导入报错) 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…

软件设计原则

文章目录 一、软件设计原则1. 开闭原则2. 里氏代换原则3. 依赖倒转原则4. 接口隔离原则5. 迪米特法则6. 合成复用原则 一、软件设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据软件…

【ASP.NET MVC】使用动软(四)(12)

一、筛选器类和Cookie实现路由 需解决的问题: 网站登录往往需要用户名密码验证,为避免重复验证,一般采用Cookie 、Session等技术来保持用户的登录状态: Session是在服务端保存的一个数据结构,用来跟踪用户的状态&…

Last-Mile Embodied Visual Navigation 论文阅读

论文阅读 题目:Last-Mile Embodied Visual Navigation 作者:JustinWasserman, Karmesh Yadav 来源:CoRL 时间:2023 代码地址:https://jbwasse2.github.io/portfolio/SLING Abstract 现实的长期任务(例如…

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中,需要使用一个地图,展示产品的分布区域及数量。希望的交互是,鼠标放上标点,tooltip展示地点和数量等信息。鼠标滚动,则页面随着滚动。但是鼠标事件是被地图代理了的,鼠标滚动意味着地图的…

4,链表【p5】

链表 4.1哈希表简介4.2有序表简介4.3链表4.3.1例1-反转单向和双向链表4.3.2例2-打印两个有序链表的公共部分4.3.3面试时链表解题的方法论4.3.4例3-判断一个链表是否为回文结构4.3.4.1快慢指针 4.3.5例4-将单向链表按某值划分成左边小、中间相等、右边大的形式4.3.6例5-复制好友…

RabbitMQ - 简单案例

目录 0.引用 1.Hello world 2.轮训分发消息 2.1 抽取工具类 2.2 启动两个工作线程接受消息 2.4 结果展示 3.消息应答 3.1 自动应答 3.2 手动消息应答的方法 3.3 消息自动重新入队 3.4 消息手动应答代码 4.RabbitMQ 持久化 4.1 队列如何实现持久化 4.2 消息实现持久化 5.不…

DBSCAN聚类

一、概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点,因此DBSCAN聚类的方式也可以用于异常点的检测。 二、算法…

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点,需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外,此外,开发者还应关注音乐版权问题,确保开发的应用合规合法。 前言 前面写了几期关于直播 …

SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》:让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业(餐厅、饭店&#x…

leetcode 1290.二进制链表转整数

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;二进制链表转整数 ps&#xff1a; 1 0 1 (0 << 1) 1 0 1 1 (1 << 1) 0 2 0 2 (2 << 1) 1 4 1 5代码&#xff1a; int getDecimalValue(struct ListNode* head) {int ans 0;while(head !…

滇医通微信小程序分析笔记

注意 本文章仅供学习交流使用&#xff0c;如果你是铁粉你就会知道博主之前发布过一篇相关的文章&#xff0c;但是由于代码涉及到法律相关所以就隐藏了&#xff0c;两年的时间过去了&#xff0c;因为女朋友已经早早安排上了&#xff0c;所以就搁置了&#xff0c;本次不做代码分…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…