设计模式——建造者模式03
工厂模式注重直接生产一个对象,而建造者模式 注重一个复杂对象是如何组成的(过程),在生产每个组件时,满足单一原则,实现了业务拆分。
设计模式,一定要敲代码理解

组件抽象
public interface Icomponent {String position(); //材料分类 :地板 屋顶 门 窗String type(); //具体材料 如 木窗 ,水泥屋顶BigDecimal price(); //每平方米的价格}
组件实现(部分展示)
- 平开窗
/*** @author ggbond* @date 2024年04月02日 09:37* 平开窗*/
public class CasementWindow implements Icomponent {@Overridepublic String position() {return "窗户";}@Overridepublic String type() {return "平开窗";}@Overridepublic BigDecimal price() {return new BigDecimal(120);}}
- 推拉窗
/*** @author ggbond* @date 2024年04月02日 09:37* 推拉窗*/
public class SlidingWindow implements Icomponent {@Overridepublic String position() {return "窗户";}@Overridepublic String type() {return "旋转窗";}@Overridepublic BigDecimal price() {return new BigDecimal(80);}
}
- 瓦片屋顶
/*** @author ggbond* @date 2024年04月02日 09:36* 瓦片屋顶*/
public class TileRoof implements Icomponent {@Overridepublic String position() {return "屋顶";}@Overridepublic String type() {return "瓦片屋顶";}@Overridepublic BigDecimal price() {return new BigDecimal(60);}
}
组件聚合抽象(需建造的对象)
public interface Ihouse {Ihouse addDoor(Icomponent door);Ihouse addFloor(Icomponent floor);Ihouse addWindow(Icomponent window);Ihouse addRoof(Icomponent roof);String getInfo();
}
组件聚合实体
public class House implements Ihouse{private HashMap<String,Icomponent> map;private String name;private BigDecimal area;private BigDecimal prize=BigDecimal.ZERO;private House(){};public House(float area, String name){map=new HashMap<>();this.area=new BigDecimal(area);this.name=name;}@Overridepublic Ihouse addDoor(Icomponent door) {map.put("door",door);prize=prize.add(door.price());return this;}@Overridepublic Ihouse addFloor(Icomponent floor) {map.put("floor", floor);prize=prize.add(area.multiply(floor.price()));return this;}@Overridepublic Ihouse addWindow(Icomponent window) {map.put("window", window);prize=prize.add(area.multiply(window.price()));return this;}@Overridepublic Ihouse addRoof(Icomponent roof) {map.put("roof", roof);prize=prize.add(area.multiply(roof.price()));return this;}@Overridepublic String getInfo(){StringBuilder info=new StringBuilder("房子名称:"+name+"\r\n"+"装修面积:"+area+"\r\n"+"装修材料如下:"+"\r\n"+map.get("door").type()+"\r\n"+map.get("window").type()+"\r\n"+map.get("roof").type()+"\r\n"+map.get("floor").type()+"\r\n"+"装修费用共计:"+prize+" 元"+"\r\n"+"---------------------------"+"\r\n");return info.toString();}
}
建造者
负责封装实体对象
public class Builder {public Ihouse type1(float area,String name){return new House(area,name).addDoor(new WoodDoor()).addFloor(new WoodFloor()).addWindow(new SlidingWindow()).addRoof(new TileRoof());}public Ihouse type2(float area,String name){return new House(area,name).addDoor(new GlassDoor()).addFloor(new MarbleFloor()).addWindow(new CasementWindow()).addRoof(new CementRoof());}
}
测试
public class Main {public static void main(String[] args) {Builder builder=new Builder();System.out.println(builder.type1(60f,"ggbond_house1").getInfo());System.out.println(builder.type2(120f,"ggbond_house2").getInfo());}
}
结果展示
房子名称:ggbond_house1
装修面积:60
装修材料如下:
木制门
旋转窗
瓦片屋顶
木质地板
装修费用共计:12460 元
---------------------------房子名称:ggbond_house2
装修面积:120
装修材料如下:
玻璃门
平开窗
水泥屋顶
大理石地砖
装修费用共计:22930 元
---------------------------
总结
建造模式把一个复杂的对象或者流程进行逐个设计,使得各个部分职责划分明确。并对内部进行封装,结合上述代码使用者可以不知道house消息,即可通过builder进行生产不同对象实体。
代码下载
代码下载
相关文章:
设计模式——建造者模式03
工厂模式注重直接生产一个对象,而建造者模式 注重一个复杂对象是如何组成的(过程),在生产每个组件时,满足单一原则,实现了业务拆分。 设计模式,一定要敲代码理解 组件抽象 public interface …...
【机器学习】《机器学习算法竞赛实战》思考练习(更新中……)
文章目录 第2章 问题建模(一)对于多分类问题,可否将其看作回归问题进行处理,对类别标签又有什么要求?(二)目前给出的都是已有的评价指标,那么这些评价指标(分类指标和回归…...
机场数据治理系列介绍(5)民用机场智慧能源系统评价体系设计
目录 一、背景 二、体系设计 1、评价体系设计维度 2、评价体系相关约定 3、评价指标体系框架设计 4、能源利用评价指标 5、环境友好评价指标 6、智慧管控评价指标 7、安全保障评价指标 三、具体落地措施 一、背景 在“双碳”国策之下,各类机场将能源系统建…...
[LeetCode][LCR190]加密运算——全加器的实现
题目 LCR 190. 加密运算 计算机安全专家正在开发一款高度安全的加密通信软件,需要在进行数据传输时对数据进行加密和解密操作。假定 dataA 和 dataB 分别为随机抽样的两次通信的数据量: 正数为发送量负数为接受量0 为数据遗失 请不使用四则运算符的情况…...
Linux: linux常见操作指令
目录 01.ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要) 06.rmdir指令 && rm 指令(重要) 07.man指令(重要) 07.cp指令(重要) 08.mv指令&#…...
【BPNN】BP神经网络代码
主代码 %function main() clc clear close all %% 1.原始数据 %输入 SR1[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63]; SR2[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.2…...
基于mqtt的物联网控制移动应用程序开发
具体实现问题 MQTT模型、特点、服务质量、报文、消息类型表 java实现mqtt两种方式:Paho Java原生库、spring boot MQTT与HTTP:哪一个最适合物联网? mqtt协议和http协议区别 应用是如何实现mqtt协议 通过调用安卓的MQTT库来实现MQTT协议&…...
MPLS-基础、LSR、LSP、标签、体系结构
MPLS技术 MPLS基础 MPLS:转发数据时,只在网络边缘分析IP报文头,不在每一跳都分析,节约了转发时间。 MPLS:Multiprotocol Label Switching,多协议标签交换骨干网技术。主要应用:VPN、流量工程…...
【RV1126】Ubuntu22.04下sdk编译问题汇集
对于新版本Ubuntu系统来编译SDK,尤其是buildroot ,是一个巨大考验,发现问题如下: 1. c-stack.c的SIGSTKSZ错误 buildroot 报错:c-stack.c:55:26:error:missing binary operator before token “(“55 在buildroot目录中找到c-s…...
51单片机使用uart串口和助手简单调试
基础知识 参考 特殊功能寄存器PCON(控制波特率是否加倍SMOD)、TMOD(T0,T1计时器的功能方式)、TCON(T0,T1计时器的控制)、串口中断、SCON(串口数据控制寄存器) 关闭定时器1中断&…...
Python网络爬虫(五):b站弹幕
上一篇对b站的视频评论爬取进行了探讨,这一篇是弹幕。直接上代码: import csv import json import re import chardet import requestsheaders = {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Saf…...
Docker环境安装Postgresql数据库Posrgresql 15.6
宿主机是ubuntu 22.04版本 ubuntu宿主机上安装docker,参见官方文档https://docs.docker.com/engine/install/ubuntu/, docker-ce是社区版 docker-ee是企业版 1、检查Docker是否安装 rootODS1SPGOFSDEV:~# docker Command docker not found, but can be installed …...
当代软件专业大学生与青年在新质生产力背景下的发展探究
在新质生产力的浪潮中,信息技术以前所未有的速度革新,为软件专业的大学生和青年带来了丰富的机遇,同时也伴随着一系列的挑战。他们如何把握时代的脉搏,实现个人的发展,成为了值得深入探讨的话题。 一、新质生产力背景下的机遇 随着新质生产力的不断发展,信息技术在各个领…...
MATLAB——知识点备忘
最近在攻略ADC建模相关方面,由好多零碎的知识点,这里写个备忘录。 Matlab 判断一个数是否为整数 1. isinteger 函数 MATLAB中,可以使用 isinteger 函数来判断一个数是否为整数,例如:要判断x是否为整数可以采用以下代…...
C++入门(以c为基础)——学习笔记2
1.引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间。在语法层面,我们认为它和它引用的变量共用同一块内存空间。 可以取多个别名,也可以给别名取别名。 b/c/d本质都是别名&#…...
设计模式-单例模式(懒汉式)
1. 概念 保证一个类只有一个实例并为该实例提供一个全局唯一的访问节点 2. 懒汉式-方式一 2.1 代码示例(方式一) 示例 public class Singleton03 {/*** 构造器私有化*/private Singleton03() {}/*** 成员变量*/private static Singleton03 INSTANCE;…...
算法| ss 回溯
39.组合总数46.全排列—478.子集79.单词搜索—1连续差相同的数字—1 39.组合总数 /*** param {number[]} candidates* param {number} target* return {number[][]}*/ // 思路 // dfs传参,传idx, 剩余target // dfs返回: 0 收集,…...
基于R语言绘制-散点小提琴图
原文链接:R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章,这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码,后台回复关键词:20240405 绘图 设置路径 setwd("You…...
Arduino开发 esp32cam+opencv人脸识别距离+语音提醒
效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用(修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …...
LeNet卷积神经网络
文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下: self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数,out_cha…...
Qwen3-Embedding国产化部署
从单一型人才到AI带领下的复合型人才 1.1 传统职能的终结 传统软件公司怎么干的? 销售、售前、交付、研发、市场、运维——各司其职,职能清晰。看起来很专业,但实际上是什么?一堆冗余的角色在等活干。 这不是高效,这是…...
大数据在电力行业的应用案例解析 -【电力技术】(一)—— 基于电力大客户运营的大数据落地拓展
目录 一、电力大客户运营场景与大数据价值 二、大数据平台架构(大客户运营专用) 三、落地应用案例一:电力大客户价值分群与精准画像 1. 业务目标 2. 数据宽表(工程常用) 3. 核心算法:K-Means 用户分群(简化示例代码) 4. 应用效果 四、落地应用案例二:大客户负荷…...
COMSOL中固态锂离子电池的电-热-力耦合仿真:考虑扩散诱导应力、热应力及外部挤压应力的影响
COMSOL 固态锂离子电池仿真 固态锂离子电池电-热-力耦合仿真,考虑了扩散诱导应力,热应力以及外部挤压应力。固态电池鼓包变形的时候,工程师老张盯着屏幕上的应力云图直挠头。这玩意儿明明充满电就膨胀,放完电又缩回去,…...
Swin2SR惊艳效果展示:低清草稿图秒变4K高清作品集
Swin2SR惊艳效果展示:低清草稿图秒变4K高清作品集 你有没有遇到过这种情况?一张特别有感觉的AI生成图,可惜分辨率太低,放大后全是马赛克;一张珍贵的旧照片,像素模糊得看不清人脸;或者从网上找到…...
PP实战指南:ECN工程变更在物料计划中的关键应用与系统操作解析
1. ECN工程变更的核心价值与业务场景 第一次接触ECN(Engineering Change Notice)是在2015年负责汽车零部件项目时,当时产线因为一个螺丝规格变更导致全线停产8小时。这个惨痛教训让我深刻理解到,工程变更绝不是简单的技术文档更新…...
PHP 的异步编程 该怎么选择
一切的起点:synchronized 的舒适区 刚开始写代码时,思维往往停留在"单机"模式。遇到需要控制并发的地方,直觉反应就是加个 synchronized 关键字。 1. 曾经写过的代码 // 简单的库存扣减 public synchronized void deductStock(Stri…...
图结构AI Agent记忆机制深度解析:小白/程序员必备,收藏学习大模型前沿技术!
图结构AI Agent记忆机制深度解析:小白/程序员必备,收藏学习大模型前沿技术! 本文深入解析了基于图结构的AI Agent记忆机制,揭示了LLM驱动AI Agent面临的三大局限:知识截断、工具 incompetence 和性能饱和。文章强调记…...
开源条码字体技术:如何通过字体文件彻底改变条码生成方式
开源条码字体技术:如何通过字体文件彻底改变条码生成方式 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 条码生成技术长期以来依赖专业软件和专用…...
STM32L152RE 32MHz时钟配置库:超低功耗MCU高频稳定启动方案
1. 项目概述ST_L152_32MHZ是一个专为 STMicroelectronics Nucleo-L152RE 开发板设计的轻量级时钟配置库,其核心目标是将系统主频(SYSCLK)从出厂默认的 32 kHz LSE 或 16 MHz HSI 稳定提升至32 MHz,并确保所有关键外设时钟…...
Go 协程池设计与调度实现
Go 协程池设计与调度实现 在并发编程中,Go 语言的协程(goroutine)以其轻量级和高性能著称。无限制地创建协程可能导致资源耗尽,影响系统稳定性。为此,协程池的设计与调度成为优化高并发场景的重要手段。本文将深入探讨…...
