《JAVA与模式》之建造模式

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、产品的内部表象
  • 二、使用场景
  • 三、使用建造模式构建复杂对象


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述
在阎宏博士的《JAVA与模式》一书中开头是这样描述建造(Builder)模式的:

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。


一、产品的内部表象

一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎么组成产品。

对象性质的建造
  有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址得到赋值之前,这个电子邮件不能发送。

有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程。由于建造零件的过程很复杂,因此,这些零件的建造过程往往被“外部化”到另一个称做建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完毕的产品对象。

建造模式利用一个导演者对象和具体建造者对象一个个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

建造模式的结构

在这里插入图片描述
在这个示意性的系统里,最终产品Product只有两个零件,即part1和part2。相应的建造方法也有两个:buildPart1()和buildPart2()、同时可以看出本模式涉及到四个角色,它们分别是:

抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。

具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。

一般来说,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。
   产品类Product

public class Product {
   
    /**
     * 定义一些关于产品的操作
     */
    private String part1;
    private String part2;
    public String getPart1() {
   
        return part1;
    }
    public void setPart1(String part1) {
   
        this.part1 = part1;
    }
    public String getPart2() {
   
        return part2;
    }
    public void setPart2(String part2) {
   
        this.part2 = part2;
    }
}

抽象建造者类Builder

public interface Builder {
   
    public void buildPart1();
    public void buildPart2();
    public Product retrieveResult();
}

具体建造者类ConcreteBuilder

public class ConcreteBuilder implements Builder {
   

    private Product product = new Product();
    /**
     * 产品零件建造方法1
     */
    @Override
    public void buildPart1() {
   
        //构建产品的第一个零件
     product.setPart1("编号:9527");
    }
    /**
     * 产品零件建造方法2
     */
    @Override
    public void buildPart2() {
   
        //构建产品的第二个零件
     product.setPart2("名称:XXX");
    }
    /**
     * 产品返还方法
     */
    @Override
    public Product retrieveResult() {
   
        return product;
    }

}

导演者类Director

public class Director {
   
    /**
     * 持有当前需要使用的建造器对象
     */
    private Builder builder;
    /**
     * 构造方法,传入建造器对象
     * @param builder 建造器对象
     */
    public Director(Builder builder){
   
        this.builder = builder;
    }
    /**
     * 产品构造方法,负责调用各个零件建造方法
     */
    public void construct(){
   
        builder.buildPart1();
        builder.buildPart2();
    }
}

客户端类Client

public class Client 

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

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

相关文章

下一站,华东理工大学!

Datawhale线下 承办单位:华东理工大学创新创业协会 华东理工大学(East China University of Science and Technology),简称华理(ECUST),坐落于上海市,是中华人民共和国教育部直属的…

机器人大赛有什么用?

机器人大赛在多个方面都具有显著的价值。首先,机器人大赛可以为学生提供一个实践与创新的机会,有助于培养学生的动手实践能力和创新思维。在比赛过程中,学生需要运用所学的知识和技能,设计、制作和调试机器人,这不仅可…

【前端寻宝之路】学习和总结文本和图片位置和类型设置

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-YaQjeEzlBXrYuFKV {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM(International Business Machines Corporation) 公司于1981年提出并开发,后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

力扣串题:字符串中的第一个唯一字母

映射做法&#xff1a;将字母转为数字之类的转化必须在运算中实现如-a int firstUniqChar(char * s){int a[26] {0};int len strlen(s);int i;for (i 0; i < len; i)a[s[i] - a];for (i 0; i < len; i) {if (a[s[i] - a] 1)return i;}return -1; }

聚观早报 | 比亚迪e2荣耀版上市;华为享界S9正式亮相

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月14日消息 比亚迪e2荣耀版上市 华为享界S9正式亮相 理想汽车L系列改名 极氪全新纯电MPV车型曝光 vivo X100S外…

一键导入Figma,让团队文件管理更加便捷安全!

如何将Figma引入国内软件已成为人们关注的话题。本文将分享两种Figma导入方法&#xff0c;使您的设计文件更加安全。 两种方法&#xff0c;一键导入Figma文件 即时设计是一种基于云的设计工具&#xff0c;在功能和特性上与Figma非常相似。如果你熟悉Figma的界面&#xff0c;即…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

RAG一文读懂!概念、场景、优势、对比微调与项目代码示例

本文结合“基于 ERNIE SDKLangChain 搭建个人知识库”的代码示例&#xff0c;为您讲解 RAG 的相关概念。 01 概念 在2020年 Facebook AI Research(FAIR)团队发表一篇名为《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》的论文。这篇论文首次提出了 RA…

Midjourney绘图欣赏系列(九)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (5 / 5)

vtkProp的组件和其他类型 通常希望将演员收集到一个依赖于变换的层次结构中。例如&#xff0c;一个机器人手臂可以由刚性连接的链接表示&#xff0c;这些链接在肩关节、上臂、肘部、下臂、腕关节和手部等关节处连接在一起。在这种配置中&#xff0c;当肩关节旋转时&#xff0c;…

[C++]20.实现红黑树。

实现红黑树 一.基本概念&#xff1a;1.红黑树的概念&#xff1a;2.红黑树的性质&#xff1a; 二.实现红黑树&#xff1a;1.基本结构&#xff1a;2.插入节点的多种情况&#xff1a;1.叔叔存在且为红&#xff1a;2.叔叔不存在/存在且为黑(单旋变色)3.叔叔不存在/存在且为黑(多旋&…

Wi-Fi 6E简介:扩展Wi-Fi的频谱资源

一、Wi-Fi 6E是什么&#xff1f; Wi-Fi 6E是Wi-Fi 6的一个增强版本&#xff0c;其中的“E”代表“Extended”。它采用了相同的技术标准&#xff0c;但使用了更高的频段。Wi-Fi 6E在5 GHz频段之外引入了新的6 GHz频段&#xff0c;为用户提供了更多的可用频谱&#xff0c;以便提…

滑动窗口算法(1)

目录 基本概念 209.长度最小的子数组 一、题目描述 二、思路解析 三、代码 3.无重复字符的最长子串 一、题目描述 二、思路解析 三、代码 1004.最大连续1的个数 一、题目描述 二、思路解析 三、代码 1658.将x减到0的最小操作数 一、题目描述 二、思路解析 三、…

JSP-内置对象

Out对象 作用&#xff1a;用来给页面输出数据。 主要方法&#xff1a; Print(string) </br>换行 Println(string) 方法同上 <%page language"java" contentType"text/html;charsetUTF-8"%> <html><head><title>test.…

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址&#xff1a; https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾&#xff0c;使用的网络为unet&#xff0c; 网络代码&#xff1a; import torch import torch.nn as nn from torchsumm…

Prompt提示工程上手指南:基础原理及实践(二)-Prompt主流策略

前言 上篇文章将Prompt提示工程大体概念和具体工作流程阐述清楚了&#xff0c;我们知道Prompt工程是指人们向生成性人工智能&#xff08;AI&#xff09;服务输入提示以生成文本或图像的过程中&#xff0c;对这些提示进行精炼的过程。生成人工智能是一个根据人类和机器产生的数…

【Python】使用plt库绘制动态曲线图,并导出为GIF或MP4

一、绘制初始图像 正常使用plt进行绘图&#xff0c;这里举例一个正弦函数&#xff1a; 二、绘制动态图的每一帧 思路&#xff1a; 根据横坐标点数绘制每一帧画面每次在当前坐标处&#xff0c;绘制一个点和垂直的线&#xff0c;来表示当前点可以在点上加个坐标等样式来增加…

Gut Microbes | 新生儿微生物组研究的方法学挑战

摘要 新生儿出生后&#xff0c;肠道菌群的定植对新生儿的健康发育起着至关重要的作用&#xff0c;并影响其日后的健康和疾病。了解新生儿肠道菌群的发育以及其与新生儿宿主的相互作用是一个重要的研究领域。然而&#xff0c;该领域的研究必须解决影响研究方法设计和实施的一系…