Java设计模式之建造者模式

建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

三个角色:建造者具体的建造者监工使用者

  • 建造者角色:定义生成实例所需要的所有方法;
  •  具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
  •  监工角色:定义使用建造者角色中的方法来生成实例的方法;
  •  使用者:使用建造者模式。

注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。

建造者角色:

public abstract class Builder {public abstract void buildPart1();public abstract void buildPart2();public abstract void buildPart3();
}

监工角色:

public class Director {    // 将一个复杂的构建过程与其表示相分离private Builder builder;    // 针对接口编程,而不是针对实现编程public Director(Builder builder) {this.builder = builder;}public void setBuilder(Builder builder) {this.builder = builder;}public void construct() {   // 控制(定义)一个复杂的构建过程builder.buildPart1();for (int i = 0; i < 5; i++) {   // 提示:如果想在运行过程中替换构建算法,可以考虑结合策略模式。builder.buildPart2();}builder.buildPart3();}
}

具体的建造者角色:

/*** 此处实现了建造纯文本文档的具体建造者。* 可以考虑再实现一个建造HTML文档、XML文档,或者其它什么文档的具体建造者。* 这样,就可以使得同样的构建过程可以创建不同的表示*/
public class ConcreteBuilder1 extends Builder {private StringBuffer buffer = new StringBuffer();//假设 buffer.toString() 就是最终生成的产品@Overridepublic void buildPart1() {//实现构建最终实例需要的所有方法buffer.append("Builder1 : Part1\n");}@Overridepublic void buildPart2() {buffer.append("Builder1 : Part2\n");}@Overridepublic void buildPart3() {buffer.append("Builder1 : Part3\n");}public String getResult() {//定义获取最终生成实例的方法return buffer.toString();}
}

客户角色:

public class Client {public void testBuilderPattern() {ConcreteBuilder1 b1 = new ConcreteBuilder1();//建造者Director director = new Director(b1);//监工director.construct();//建造实例(监工负责监督,建造者实际建造)String result = b1.getResult();//获取最终生成结果System.out.printf("the result is :%n%s", result);}
}

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

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

相关文章

力扣--数组类题目27. 移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 解释&#xff1a;函数应该返回新的长度 2, 并且 n…

曲面(弧面、柱面)展平(拉直)瓶子标签识别ocr

瓶子或者柱面在做字符识别的时候由于变形&#xff0c;识别效果是很不好的 或者是检测瓶子表面缺陷的时候效果也没有展平的好 下面介绍两个项目&#xff0c;关于曲面&#xff08;弧面、柱面&#xff09;展平&#xff08;拉直&#xff09; 项目一&#xff1a;通过识别曲面的6个点…

《Go 语言第一课》课程学习笔记(十)

复合数据类型 同构复合类型&#xff1a;从定长数组到变长切片 由多个同构类型&#xff08;相同类型&#xff09;或异构类型&#xff08;不同类型&#xff09;的元素的值组合而成&#xff0c;这类数据类型在 Go 语言中被称为复合类型。 数组有哪些基本特性&#xff1f; Go 语…

c语言 - inline关键字(内联函数)

概念 在编程中&#xff0c;inline是一个关键字&#xff0c;用于修饰函数。inline函数是一种对编译器的提示&#xff0c;表示这个函数在编译时应该进行内联展开。 内联展开是指将函数的代码插入到调用该函数的地方&#xff0c;而不是通过函数调用的方式执行。这样可以减少函数调…

用手势操控现实:OpenCV 音量控制与 AI 换脸技术解析

基于opencv的手势控制音量和ai换脸 HandTrackingModule.py import cv2 import mediapipe as mp import timeclass handDetector():def __init__(self, mode False, maxHands 2, model_complexity 1, detectionCon 0.5, trackCon 0.5):self.mode modeself.maxHands max…

MySQL三大日志(binlog、redo log和undo log)详解

1.redo log redo log是InnoDB存储引擎层的日志&#xff0c;又称重做日志文件。 用于记录事务操作的变化&#xff0c;记录的是数据修改之后的值&#xff0c;不管事务是否提交都会记录下来 redo log包括两部分&#xff1a;一个是内存中的日志缓冲(redo log buffer)&#xff0c;另…

PythonJS逆向解密——实现翻译软件+语音播报

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 pycharm 模块使用: requests --> pip install requests execjs --> pip install PyExecJS ttkbootstrap --> pip install ttkbootstrap pyttsx3 --> pip install pyttsx3 第三…

数据分享|R语言PCA主成分、lasso、岭回归降维分析近年来各国土地面积变化影响...

全文链接&#xff1a;http://tecdat.cn/?p31445 机器学习在环境监测领域的应用&#xff0c;着眼于探索全球范围内的环境演化规律&#xff0c;人类与自然生态之间的关系以及环境变化对人类生存的影响&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 课题着眼于…

Yolov8小目标检测(10):DCNv3可形变卷积助力涨点,COCO新纪录65.4mAP | CVPR2023 InternImage

💡💡💡本文改进:DCNv3,基于DCNv2算子引入共享投射权重、多组机制和采样点调制 DCNv3 | 亲测在红外弱小目标检测涨点,map@0.5 从0.755提升至0.765 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一…

Rocky linux 8.8 基础环境一键配置

1、有线 dnf install -y net-tools dnf install -y vim dnf install -y wget sudo dnf install epel-release -y sudo dnf install dkms -ysudo dnf install -y dnf-utils device-mapper-persistent-data lvm2 sudo dnf config-manager --add-repohttps://download.docker.com…

事件捕获和事件冒泡

事件捕获和事件冒泡与事件流有关系。 以下代码&#xff0c;点击 aa &#xff0c;控制台会打印什么呢&#xff1f; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content&q…

ChatGPT在智能娱乐和游戏互动中的应用如何?

在智能娱乐和游戏互动领域&#xff0c;ChatGPT具有广泛的应用潜力&#xff0c;可以为用户带来更丰富、个性化和有趣的体验。从虚拟角色和游戏情节到实时互动和玩家支持&#xff0c;ChatGPT可以在多个方面为游戏产业带来创新和改变。 **1. **虚拟角色和NPC互动**&#xff1a;Ch…

Delphi 开发手持机(android)打印机通用开发流程(举一反三)

目录 一、场景说明 二、厂家应提供的SDK文件 三、操作步骤&#xff1a; 1. 导出Delphi需要且能使用的接口文件&#xff1a; 2. 创建FMX Delphi项目&#xff0c;将上一步生成的接口文件&#xff08;V510.Interfaces.pas&#xff09;引入: 3. 将jarsdk.jar 包加入到 libs中…

回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-…

带着问题看SpringBoot

带着问题看SpringBoot 1、Spring容器具体是什么&#xff1f; 跟进run方法&#xff0c;context this.createApplicationContext()&#xff0c;得出容器是AnnotationConfigServletWebServerApplicationContext类。 SpringApplication.run(ServeroneApplication.class, args);…

小匠物联联合亚马逊云助力企业数智化出海

如何让家电企业出海产品数智化之路走上康庄大道&#xff1f;8月25日,亚马逊云科技[创新成长企业专列]这趟上云快车将开往宁波站&#xff0c;助力宁波的制造、软件等企业扬帆起航&#xff01;现场举办“亚马逊云科技助力企业出海数智沙龙”&#xff0c;小匠物联受邀出席。 会议现…

有没有好用的微信管理软件?解决企业营销管理痛点

企业营销管理痛点&#xff1a; 1、如何提高员工跟进客户的能力和效率&#xff1f; 2、怎么杜绝飞单私单工作怠慢等问题&#xff1f; 3、微信好友太多无法实现精准营销&#xff1f; 4、如何第一时间知道员工的违规行为&#xff1f; 多微信聚合聊天 多个微信号聚合在一个界面…

【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)

说明&#xff1a; 前端使用&#xff1a;vue3.0 前后端对接数据格式&#xff1a;无非就是前端把后端返回的数据处理为自己想要的格式&#xff0c;或者&#xff0c;后端给前端处理好想要的格式&#xff1b; 针对前后端的柱状图&#xff0c;趋势图等数据对接&#xff0c;前端一般需…

iOS开发Swift-字符串与字符

1.字符串的定义 let someString "some string value"2.多行字符串的定义(""") let quotation """ 有一个人前来买瓜。 "这瓜甜吗&#xff1f;"他问。 """前一个"""前和后一个""&…

线性代数的学习和整理8:行列式相关

目录 1 从2元一次方程组求解说起 1.1 直接用方程组消元法求解 1.2 有没有其他方法呢&#xff1f;有&#xff1a;比如2阶行列式方法 1.3 3阶行列式 2 行列式的定义 2.1 矩阵里的方阵 2.2 行列式定义&#xff1a;返回值为标量的一个函数 2.3 行列式的计算公式 2.4 克拉…