秒懂设计模式--学习笔记(6)【创建篇-建造者模式】

目录

      • 5、建造者模式
          • 5.1 介绍
          • 5.2 建造步骤的重要性
          • 5.3 地产开发商的困惑
          • 5.4 建筑施工方
          • 5.5 工程总监
          • 5.6 项目实施
          • 5.7 建造者模式的各角色定义
          • 5.8 建造者模式

5、建造者模式

5.1 介绍
  • 建造者模式(Builder)又称为生成器模式,主要用于对复杂对象的构建、初始化
    • 它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象
  • 所构建的对象一定是庞大而复杂的,并且一定是按照既定的制造工序将组件组装起来的。我们通常将负责构建这些大型对象的工程师称为建造者
  • 建造者模式的主要目的在于把烦琐的构建过程从不同对象中抽离出来,使其脱离并独立于产品类与工厂类
    • 最终实现用同一套标准的制造工序能够产出不同的产品
  • 测试类文件
    建造者模式测试类文件
5.2 建造步骤的重要性
  • 建造者面对着什么样的产品模型
    • 玩家选定角色后需要对其进行初始化,假设整个过程分3个步骤完成
      • 第一步,玩家需要为角色选择形象以及分配力量、灵力、体力、敏捷等属性值
      • 第二步,玩家可以为角色配备不同的衣服或铠甲,低于所需力量值的铠甲则不能穿戴;
      • 第三步,玩家选择手持的武器与盾牌,它同上一步一样需要满足一定的条件
    • 成型的游戏角色是依靠角色对象、装备对象组装而成的,对于这种复杂对象的构建一定要依赖建造者来完成
    • 建造者的制造过程不仅要分步完成,还要按照顺序进行
  • 建造者的各制造步骤与逻辑都应该被抽离出来独立于数据模型
  • 复杂的游戏角色设定还需交给专业的建造团队去完成
5.3 地产开发商的困惑
  • 严谨的设计与施工流程的把控
  • 建筑物本身应该由多个组件组成,且各组件按一定工序建造,缺一不可
  • 为了简化其数据模型,我们将组成建筑物的模块归纳为3个组件,分别是地基、墙体、屋顶,将它们组装起来就能形成一座建筑物
    • 以List承载各组件,模拟复杂对象中各组件的顺序组装
    • 分别定义各组件对应的建造方法
    • 用字符串对象String来模拟各个组件对象
    • 重写了toString()方法,按从大到小的组件索引顺序组装各组件,后组装的组件应先展示出来,如屋顶应该首先输出
package builder.entity;import java.util.ArrayList;
import java.util.List;/*** 数据模型-建筑物类**/
public class Building {/*** 用list来模拟建筑物组件的组装*      以List承载各组件,模拟复杂对象中各组件的顺序组装*/private List<String> buildingComponents = new ArrayList<>();// 地基public void setBasement(String basement) {this.buildingComponents.add(basement);}// 墙体public void setWall(String wall) {this.buildingComponents.add(wall);}// 屋顶public void setRoof(String roof) {this.buildingComponents.add(roof);}/*** 重写了toString()*      按从大到小的组件索引【顺序】组装各组件,后组装的组件应先展示出来,如屋顶应该首先输出* @return*/@Overridepublic String toString() {String buildingStr = "";for (int i = buildingComponents.size() -1; i >= 0; i--) {buildingStr += buildingComponents.get(i);}return buildingStr;}
}
  • 下一步思考
    • 怎样才能用这个复杂的类构建出一个房子对象呢?
    • 首先应该调用哪个建造方法才能保证正确的建造工序,而不至于屋顶在下面,地基却跑到天上去呢
    • 地基、墙体、屋顶,这些组件都去哪里找,如何建造
5.4 建筑施工方
  • 开发商规定施工方都应该至少具备三大组件的建造能力,于是施工标准公布
    • 施工方接口Builder:规定了3个施工标准, 具备三大组件的建造能力
    • 别墅施工方类HouseBuilder
    • 多层公寓施工方类ApartmentBuilder
package builder;import builder.entity.Building;/*** 施工方接口: 规定了3个施工标准, 具备三大组件的建造能力*         建造地基*         建造墙体*         建造屋顶*         获取建筑物,以供产品的交付**/
public interface Builder {/*** 建造地基*/public void buildBasement();/*** 建造墙体*/public void buildWall();/*** 建造屋顶*/public void buildRoof();/***  获取建筑物,以供产品的交付* @return*/public Building getBuilding();
}
package builder.impl;import builder.Builder;
import entity.Building;/***  别墅施工方类**/
public class HouseBuilder implements Builder {private Building house;public HouseBuilder() {house = new Building();}@Overridepublic void buildBasement() {System.out.println("挖土方,部署管道、线缆,水泥加固,搭建围墙、花园。");house.setBasement("╬╬╬╬╬╬╬╬\n");}@Overridepublic void buildWall() {System.out.println("搭建木质框架,石膏板封墙并粉饰内外墙。");house.setWall("|田|田 田|\n");}@Overridepublic void buildRoof() {System.out.println("建造木质屋顶、阁楼,安装烟囱,做好防水。");house.setRoof("╱◥███◣\n");}@Overridepublic Building getBuilding() {return house;}
}
package builder.impl;import builder.Builder;
import builder.entity.Building;/*** 多层公寓施工方类**/
public class ApartmentBuilder implements Builder {private Building apartment;public ApartmentBuilder() {apartment = new Building();}@Overridepublic void buildBasement() {System.out.println("深挖地基,修建地下车库,部署管道、线缆、风道。");apartment.setBasement("╚═══════════╝\n");}@Overridepublic void buildWall() {System.out.println("搭建多层建筑框架,建造电梯井,钢筋混凝土浇灌。");// 此处假设固定8层for (int i = 0; i < 8; i++) {apartment.setWall("║ □ □ □ □ ║\n");}}@Overridepublic void buildRoof() {System.out.println("封顶,部署通风井,做防水层,保温层。");apartment.setRoof("╔═══════════╗\n");}@Overridepublic Building getBuilding() {return apartment;}
}
5.5 工程总监
  • 工程总监类Director: 指导施工,并把控整个施工流程
package builder;import builder.entity.Building;/*** 工程总监类: 指导施工,并把控整个施工流程**/
public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void setBuilder(Builder builder) {this.builder = builder;}public Building direct() {System.out.println("=====工程项目启动=====");// 第一步,打好地基builder.buildBasement();// 第二步,建造框架、墙体builder.buildWall();// 第三步,封顶builder.buildRoof();System.out.println("=====工程项目竣工=====");return builder.getBuilding();}
}
  • 从宏观上管理项目并指导整个施工队的建造流程
    • 依次调用施工方的打地基方法buildBasement()、建造墙体方法buildWall()及建筑物封顶方法buildRoof(),保证了建筑物自下而上的建造工序
    • 施工方是由外部注入的,所以工程总监并不关心是哪个施工方来造房子,更不关心施工方有什么样的建造工艺
    • 但他能保证对施工工序的绝对把控,也就是说,工程总监只控制施工流程
  • 实际应用中的建造流程也许会更加复杂,且组装各个组件的流程有相对【固定】的逻辑,所以可以从施工方的建造方法中抽离出来并固化在director类中
5.6 项目实施
  • 开发商客户端类Client: 组建了别墅施工队并安排给工程总监进行管理
    • 之后调用其指导方法拿到别墅产品
    • 开发商行将工程总监管理的施工队替换为多层公寓施工方
    • 最终拿到一栋八层公寓
package builder;import builder.impl.ApartmentBuilder;
import builder.impl.HouseBuilder;/*** 开发商客户端类: 组建了别墅施工队并安排=给工程总监进行管理**/
public class Client {public static void main(String[] args) {//组建别墅施工队Director director = new Director(new HouseBuilder());System.out.println(director.direct());//替换施工队,建造公寓director.setBuilder(new ApartmentBuilder());System.out.println(director.direct());}
}
  • 工艺与工序
    • 施工方接口对施工标准的抽象化、标准化使建造者(施工方)的建造质量达到既定要求,且使各建造者的建造“工艺”能够个性化、多态化
    • 工程总监将*工作流程抽离出来独立于建造者,使建造“工序”得到统一把控
5.7 建造者模式的各角色定义
  • Product(产品):复杂的产品类,构建过程相对复杂,需要其他组件组装而成。如:建筑物类Building,需要地基、墙体、屋顶等组件组成。
  • Builder(建造者):建造者接口,定义了构成产品的各个组件的构建标准,通常有多个步骤。如:施工方接口Builder。
  • ConcreteBuilder(建造者实现):具体的建造者实现类,可以有多种实现,负责产品的组装但不包含整体建造逻辑,如:别墅施工方类HouseBuilder与多层公寓施工方类ApartmentBuilder
  • Director(指导者):持有建造者接口引用的指导者类,指导建造者按一定的逻辑进行建造。如:工程总监类Director。
5.8 建造者模式
  • 复杂对象的构建显然需要专业的建造团队
  • 建造标准的确立让产品趋向多样化
  • 建造工序则交由工程总监去全局把控
  • 最终实现通过相同的构建过程生产出不同产品

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

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

相关文章

爬虫-豆瓣电影排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…

明星代言6个提升企业形象的杀手锏-华媒舍

在当今竞争激烈的商业世界中&#xff0c;企业形象的塑造对于品牌的发展至关重要。而明星代言作为一种常见的营销手段&#xff0c;被广泛使用来提升企业形象和产品销售。本文将介绍明星代言的六个杀手锏&#xff0c;帮助您了解如何通过明星代言来提升企业形象。 1. 拥有广泛的影…

关于虚拟机CentOS 7使用ssh无法连接(详细)

虚拟机CentOS 7使用ssh无法连接 猜测&#xff1a;可能是虚拟机软件的网关和和centos7的网关不同导致的问题。 首先打开CentOS7的终端, 输入ifconfig&#xff0c;查看一下系统的ip 打开虚拟机的虚拟网络编辑器, 查看一下网关, 发现确实不一样. 这里有两种方式, 要么修改虚…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出&#xff0c;所有版本VGG均全部使用33大小、步长为1的小卷积核&#xff0c;33卷积核同时也是最小的能…

Java | Leetcode Java题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isIsomorphic(String s, String t) {Map<Character, Character> s2t new HashMap<Character, Character>();Map<Character, Character> t2s new HashMap<Character, Character>(…

Java-数据结构

数据结构概述 常见的数据结构 栈 队列 数组 链表 二叉树 二叉查找树 平衡二叉树 红黑树 示例&#xff1a;

【Go】编译frp,绕过内网安全工具

文章目录 概述常用命令编译环境配置开发环境拉取依赖打包exe输出运行打包好的exe测试 绕过安全产品实践frp使用教程 本文所提供的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用。文章作者无法鉴别判断读者使用信息及工具的真实用途&#xff0c;若读者将文章中的…

2024 年第十四届 APMCM 亚太地区大学生数学建模 B题 洪水灾害的数据分析与预测--完整思路代码分享(仅供学习)

洪水是暴雨、急剧融冰化雪、风暴潮等自然因素引起的江河湖泊水量迅速增加&#xff0c;或者水位迅猛上涨的一种自然现象&#xff0c;是自然灾害。洪水又称大水&#xff0c;是河流、海洋、湖泊等水体上涨超过一定水位&#xff0c;威胁有关地区的安全&#xff0c;甚至造成灾害的水…

基于惯性加权PSO优化的目标函数最小值求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于惯性加权PSO优化的目标函数最小值求解matlab仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09;…

使用java stream对集合中的对象按指定字段进行分组并统计

一、概述 有这样一个需求&#xff0c;在一个list集合中的对象有相同的name&#xff0c;我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求&#xff0c;这里做一个记录&#xff0c;希望对有需求的同学提供帮助 一、根据指定字段进行分组 一、先准备好给前端要…

三菱plc gxwork3 0X121201F 报错;三菱标签区域的保留容量不足;

如果占用过多把r文件寄存器的地址范围改小&#xff0c;一般文件寄存器的地址r0-8000足够了

zk集群搭建

zk集群在搭建部署的时候&#xff0c;通常选择2n1奇数台。底层 Paxos 算法支持&#xff08;过半成功&#xff09;。 zk部署之前&#xff0c;保证服务器基础环境正常、JDK成功安装。 服务器基础环境 IP主机名hosts映射防火墙关闭时间同步ssh免密登录 JDK环境 1、虚拟机克隆 …

014-GeoGebra基础篇-快速解决滑动条的角度无法输入问题

有客户反馈&#xff0c;他的Geogebra一直有个bug&#xff0c;那就是输入角度最大值时总不按照他设定的展示&#xff0c;快被气炸了~ 目录 一、问题复现&#xff08;1&#xff09;插入一个滑动条&#xff08;2&#xff09;选择Angle&#xff08;3&#xff09;输入90&#xff0c;…

复现centernet时,报错RuntimeError: CUDA error: out of memory

运行 python test.py ctdet --dataset coco --exp_id coco_dla --load_model /root/CenterNet/exp/ctdet/coco_dla/model_last.pth --gpus 0 --test_scales 1 报错下面&#xff1a; RuntimeError: CUDA error: out of memory明明显存是够用的 解决办法&#xff1a; 找到自己…

代码随想录——无重叠区间(Leetcode435)

题目链接 贪心 排序 class Solution {public int eraseOverlapIntervals(int[][] intervals) {int res 0;if(intervals.length 1 || intervals.length 0){return res;}// 按左边界排序Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] …

Protobuf(三):理论学习,简单总结

1. Protocol Buffers概述 Protocol Buffers&#xff08;简称protobuf&#xff09;&#xff0c;是谷歌用于序列化结构化数据的一种语言独立、平台独立且可扩展的机制&#xff0c;类似XML&#xff0c;但比XML更小、更快、更简单protobuf的工作流程如图所示 1.1 protobuf的优点…

【第17章】MyBatis-Plus自动维护DDL

文章目录 前言一、功能概述二、注意事项三、代码示例四、实战1. 准备2. ddl配置类3. 程序启动4. 效果(数据库) 总结 前言 在MyBatis-Plus的3.5.3版本中&#xff0c;引入了一项强大的功能&#xff1a;数据库DDL&#xff08;数据定义语言&#xff09;表结构的自动维护。这一功能…

告别高查重率,AI降重工具帮你快速过关

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

Cloudflare 推出一款免费对抗 AI 机器人的可防止抓取数据工具

上市云服务提供商Cloudflare推出了一种新的免费工具&#xff0c;可防止机器人抓取其平台上托管的网站以获取数据以训练AI模型。 一些人工智能供应商&#xff0c;包括谷歌、OpenAI 和苹果&#xff0c;允许网站所有者通过修改他们网站的robots.txt来阻止他们用于数据抓取和模型训…