设计模式-创建型-04-建造者模式

1、盖房项目需求

  • 1)需要建房子:这一过程为打桩、砌墙、封顶
  • 2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的
  • 3)请编写程序,完成需求

传统方式
在这里插入图片描述

public abstract class AbsHouse {protected abstract void piling();protected abstract void walling();protected abstract void capping();public void build() {piling();walling();capping();}
}public class NormalRoom extends AbsHouse {@Overrideprotected void piling() {System.out.println("普通房打桩...");}@Overrideprotected void walling() {System.out.println("普通房砌墙...");}@Overrideprotected void capping() {System.out.println("普通房封顶...");}
}public class HighRise extends AbsHouse {@Overrideprotected void piling() {System.out.println("高楼打桩...");}@Overrideprotected void walling() {System.out.println("高楼砌墙...");}@Overrideprotected void capping() {System.out.println("高楼封顶...");}
}public class Villa extends AbsHouse {@Overrideprotected void piling() {System.out.println("别墅打桩...");}@Overrideprotected void walling() {System.out.println("别墅砌墙...");}@Overrideprotected void capping() {System.out.println("别墅封顶...");}
}

问题分析

  • 1)优点是比较好理解,简单易操作
  • 2)设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好。也就是说,这种设计方案把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性增强了
  • 3)解决方案:将产品和产品建造过程解耦 ==> 建造者模式

2、基本介绍

  • 1)建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
  • 2)建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节
    在这里插入图片描述

3、建造者模式的四个角色

  • 1)Product(产品角色):一个具体的产品对象
  • 2)Builder(抽象建造者):可建一个 Product 对象的各个部件指定的接口 / 抽象类
  • 3)ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
  • 4)Director(指挥者):构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用
    • 一是隔离了客户与对象的生产过程
    • 二是负责控制产品对象的生产过程

4、建造者模式原理类图

在这里插入图片描述

5、建造者模式解决盖房需求

需要建房子:这一过程为打桩、砌墙、封顶。不管是普通房子也好,别墅也好都需要经历这些过程,下面我们使用建造者模式(Builder Pattern)来完成

UML 类图

在这里插入图片描述

//产品角色
public class House {private String pile;private String wall;private String roof;public String getPile() {return pile;}public void setPile(String pile) {this.pile = pile;}public String getWall() {return wall;}public void setWall(String wall) {this.wall = wall;}public String getRoof() {return roof;}public void setRoof(String roof) {this.roof = roof;}
}
//抽象建造者
public abstract class HouseBuilder {private House house = new House();public abstract void piling();public abstract void walling();public abstract void capping();public House build() {return house;}
}
//具体建造者1
public class NormalRoomBuilder extends HouseBuilder {@Overridepublic void piling() {System.out.println("普通房打桩...");}@Overridepublic void walling() {System.out.println("普通房砌墙...");}@Overridepublic void capping() {System.out.println("普通房封顶...");}
}
//具体建造者2
public class HighRiseBuilder extends HouseBuilder {@Overridepublic void piling() {System.out.println("高楼打桩...");}@Overridepublic void walling() {System.out.println("高楼砌墙...");}@Overridepublic void capping() {System.out.println("高楼封顶...");}
}
//具体建造者3
public class VillaBuilder extends HouseBuilder {@Overridepublic void piling() {System.out.println("别墅打桩...");}@Overridepublic void walling() {System.out.println("别墅砌墙...");}@Overridepublic void capping() {System.out.println("别墅封顶...");}
}
//指挥者
public class HouseDirector {private HouseBuilder houseBuilder;public HouseDirector() {}public void setHouseBuilder(HouseBuilder houseBuilder) {this.houseBuilder = houseBuilder;}public House buildHouse() {houseBuilder.piling();houseBuilder.walling();houseBuilder.capping();return houseBuilder.build();}
}public class BuilderTest {public static void main(String[] args) {HouseDirector houseDirector = new HouseDirector();House house;houseDirector.setHouseBuilder(new NormalRoomBuilder());house = houseDirector.buildHouse();houseDirector.setHouseBuilder(new HighRiseBuilder());house = houseDirector.buildHouse();houseDirector.setHouseBuilder(new VillaBuilder());house = houseDirector.buildHouse();}
}

6、JDK 源码分析

java.lang.StringBuilder 中的建造者模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
角色分析

  • Appendable接口定义了多个append方法(抽象方法),即Appendable为抽象建造者,定义了抽象方法
  • AbstractStringBuilder实现了Appendable接口方法,这里的AbstractStringBuilder已经是建造者,只是不能实例化
  • StringBuilder既充当了指挥者角色,又充当了具体的建造者,建造方法的实现是由AbstractStringBuilder完成,StringBuilder继承了AbstractStringBuilder

7、注意事项及细节

  • 1)客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  • 2)每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
  • 3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
  • 4)增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
  • 5)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
  • 6)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。因此在这种情况下,要考虑是否选择建造者模式

8、抽象工厂模式 VS 建造者模式

抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。

而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品

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

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

相关文章

【1990-2023】上市公司高新技术企业数据(Excel+stata)+do代码

数据简介:根据《上市公司资质认定信息文件》 数据进行整理。筛选“认定项目类型” 为“高新技术企业”;筛选“认定对象身份”为“上市公司本身”,根据“认定时间”和“有效期限”判断当年是否为高新技术企业。有效期限通常为3年,缺…

华为手环9省电设置

1、 手环开启熄屏显示续航约3天,原因为屏幕持续常亮显示;如不需要可通过手环“设置->表盘->熄屏显示”路径进行关闭; 2、 手环具备后台健康自动检测功能,您可根据需要选择是否使用或关闭: (1&#x…

实用软件分享-----一款免费的人工智能替换face的神器

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

DoIP——step2:车辆发现

文章目录 前言一、IP地址配置1.1 AutoIP1.2 DHCP1.3 DoIP实体的IP地址配置流程二、车辆发现车辆声明报文内容如下:前言 完成诊断设备到车辆的物理连接并通过激活线使能诊断连接后边缘节点将会将连接状态传递至应用层,在开始车辆发现过程之前,需要先进行各自的IP地址配置,获…

海外媒体发稿渠道和方法有哪些?如何选择靠谱的国外媒体发稿服务商?

在选择海外媒体发稿服务商时,以下是一些关键点可以帮助您找到靠谱的服务商: 服务商的经验和口碑:查找该服务商在行业内的声誉和客户评价。拥有丰富经验和良好口碑的服务商通常更可靠。 媒体资源和覆盖范围:了解服务商所能提供的媒…

Python并行编程技术与方法详解:线程池、进程池及优化策略

目录 一、引言 二、线程池 线程池的概念 Python中的线程池实现 线程池的优缺点 三、进程池 进程池的概念 Python中的进程池实现 进程池的优缺点 四、优化策略 合理设置线程池和进程池的大小 任务的拆分与合并 使用队列和锁等同步机制 选择合适的并行框架 五、异…

【机器学习300问】121、RNN是如何生成文本的?

当RNN模型训练好后,如何让他生成一个句子?其实就是一个RNN前向传播的过程。通常遵循以下的步骤。 (1)初始化 文本生成可以什么都不给,让他生成一首诗。首先,你需要确定采样的起始点。这可以是一个特殊的开…

MySQL-DDL(Data Definition Language)

078-对表结构进行增删改操作 增删改表结构DDL(Data Definition Language) 创建一个学生表 create table t_student( no bigint, name varchar(255), age int comment 年龄 );查看建表语句 show create table t_student;修改表名 alter table 表名 r…

Linux网络 - HTTP协议

文章目录 前言一、HTTP协议1.urlurl特殊字符 requestrespond 总结 前言 上一章内容我们讲了在应用层制定了我们自己自定义的协议、序列化和反序列化。 协议的制定相对来讲还是比较麻烦的,不过既然应用层的协议制定是必要的,那么肯定已经有许多计算机大佬…

C++使用spdlog输出日志文件

参考博客: 日志记录库 spdlog 基础使用_spdlog 写日志-CSDN博客 GitHub - gabime/spdlog: Fast C logging library. 首先在github上下载spdlog源码,不想编译成库的话,可以直接使用源码,将include文件夹下的spdlog文件夹&#x…

示例:WPF中TreeView自定义TreeNode泛型绑定对象

一、目的&#xff1a;在开发中经常需要绑定TreeView&#xff0c;所以定义了一个泛型的TreeNode<T>用来方便绑定对象和复用 二、实现 public partial class TreeNodeBase<T> : SelectBindable<T>, ITreeNode{public TreeNodeBase(T t) : base(t){}private Obs…

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…

前端三大件速成 05 javascript(2)字符串对象、数组对象、函数对象、BOM对象、DOM对象

文章目录 一、字符串对象1、创建字符串对象的两种方式2、字符串属性3、字符串的方法&#xff08;1&#xff09;编排方法&#xff08;2&#xff09;查询字符串索引&#xff08;3&#xff09;字符串切片&#xff08;4&#xff09;大小写转换&#xff08;5&#xff09;获取指定字符…

Python网络数据抓取(9):XPath

引言 XPath 是一种用于从 XML 文档中选取特定节点的查询语言。如果你对 XML 文档不太熟悉&#xff0c;XPath 可以帮你完成网页抓取的所有工作。 实战 XML&#xff0c;即扩展标记语言&#xff0c;它与 HTML&#xff0c;也就是我们熟知的超文本标记语言&#xff0c;有相似之处&am…

pyqt 鼠绘椭圆 椭圆标注

目录 pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端,椭圆参数保存加载json pyqt 画椭圆中心点固定,调整是,两端一起调整。 pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端,椭圆参数保存加载json import sys import json from …

ClickHouse快速安装教程(MacOS)

文章目录 ClickHouse快速安装教程&#xff08;MacOS&#xff09;1.ClickHouse2.快速安装3.快速启动3.1.启动服务器3.2.启动客户端 4.使用案例1.配置文件2.启动CK服务3.创建数据库4.创建表5.插入数据6.查询数据 ClickHouse快速安装教程&#xff08;MacOS&#xff09; 1.ClickHo…

【UEditorPlus】后端配置项没有正常加载,上传插件不能正常使用

接上文【UEditorPlus】后端配置项没有正常加载&#xff0c;上传插件不能正常使用_ueditor ruoyi vue后端配置项没有正常加载,上传插件不能正常使用!-CSDN博客 成功解决图片、视频上传问题后&#xff0c;当服务部署在公网时&#xff0c;会存在大文件无法正常上传的问题。 出现…

电感的本质是什么

什么是电感&#xff1f; 电感器件一般是指螺线圈&#xff0c;由导线圈一圈靠一圈地绕在绝缘管上&#xff0c;绝缘管可以是空心的&#xff0c;也可以包含铁芯或磁粉芯。 为什么把’线’绕成’圈’就是电感&#xff1f; 电感的工作原理非常抽象&#xff0c;为了解释什么是电感…

04通讯录管理系统——退出功能实现

功能描述&#xff1a;退出通讯录 思路&#xff1a;根据用户不同的选项&#xff0c;进入不同的功能&#xff0c;可以选择switch分支结构&#xff0c;将整个架构进行搭建 当用户选择0时&#xff0c;执行退出&#xff0c;选择其他时先不做操作&#xff0c;也不退出程序 代码&am…

2024年6月10日~2024年6月16日周报

文章目录 一、前段时间工作二、完成情况2.1 可变形卷积的学习2.1.1 Introduction-介绍2.1.2 Related Work-相关工作2.1.3 Method-方法2.1.3.1 可变形卷积动态属性的重认识2.1.3.2 Speeding up DCN—加速DCN 2.2 部署可变形卷积 三、假期计划 一、前段时间工作 在之前一段时间主…