设计模式——建造者模式03

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

组件抽象

public interface Icomponent {String position(); //材料分类 :地板 屋顶 门 窗String type(); //具体材料 如 木窗 ,水泥屋顶BigDecimal price(); //每平方米的价格}

组件实现(部分展示)

  1. 平开窗
/*** @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);}}
  1. 推拉窗
/*** @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);}
}
  1. 瓦片屋顶
/*** @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进行生产不同对象实体。

代码下载

代码下载

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

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

相关文章

C++ 注册Nacos

下载源码&#xff1a; git clone GitHub - nacos-group/nacos-sdk-cpp: C client for Nacos 编译源码 cd nacos-sdk-cpp cmake . make 生成库文件 在nacos-sdk-cpp 下 注册nacos 将include 和libnacos-cli.so libnacos-cli-static.a 放入你的工程 如果Nacos服务地址:…

AI Kimi:帮助教师做好试卷命题

原文&#xff1a;https://www.toutiao.com/article/7353661304307778083/?log_fromcfd0a50014034_1712243146922 最近&#xff0c;Kimichat工具很火。这款软件不仅仅是一个聊天和阅读工具&#xff0c;还是一个强大的教学辅助工具。作为一位教师&#xff0c;尝试使用Kimichat&…

HTML:框架

案例&#xff1a; <frameset cols"5%,*" ><frame src"left_frame.html"><frame src"right_frame.html"> </frameset> 一、<frameset>标签 <frameset>标签&#xff1a;称为框架标记&#xff0c;将一个HTML…

JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的自习室座位预约小程序管理系统(源代码数据库)132 一、系统介绍 本项目前后端分离带小程序&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注…

分享webgl魔幻星球

界面截图 webgl 是在网页上绘制和渲染三维图形的技术&#xff0c;可以让用户与其进行交互。divcss、canvas 2d 专注于二维图形。 对公司而言&#xff0c;webgl 可以解决他们在三维模型的显示和交互上的问题&#xff1b;对开发者而言&#xff0c;webgl 可以让我们是实现更多、更…

UE4 C++获取Niagara变量值

UE4 获取Niagara变量值 Niagara有一堆Get方法&#xff0c;但是是基于数据的&#xff0c;单独的Set方法是有的&#xff0c;因此&#xff0c;我们这参考Set源码去Get 源代码如下&#xff1a; 我们的实现&#xff08;当然要返回其他类型值&#xff0c;修改一下对应传参就行了…

在线考试|基于Springboot的在线考试管理系统设计与实现(源码+数据库+文档)

在线考试管理系统目录 目录 基于Springboot的在线考试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 管理员功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…

[问题记录] oracle问题汇总记录

plsql问题 1、oracle-initialization error could not locate OCI.dll 下载plsql客户端后&#xff0c;登录显示如图所示的错误 解决方法&#xff0c;点击下方链接&#xff0c;下载64位客户端 Instant Client for Microsoft Windows (x64) 64-bit (oracle.com) 2、显示中文乱…

MongoDB 启动异常

Failed to start up WiredTiger under any compatibility version. 解决方案: 删除WiredTiger.lock 和 mongod.lock两个文件&#xff0c;在重新启动。回重新生成新的文件。

72小时内报告!美国发布关键基础设施网络攻击通报新规草案

美国网络安全和基础设施安全局(CISA)本周四发布了关键基础设施企业如何向政府报告网络攻击的规定草案。 新规基于拜登2022年3月15日签署的美国《关键基础设施网络事件报告法案》(简称CIRCIA)。这是美国联邦政府首次提出一套跨关键基础设施部门的全面网络安全规则。CISA正在就规…

的C++奇迹之旅:值和引用的本质效率与性能比较

文章目录 请添加图片描述 [TOC](文章目录) &#x1f4dd;引用# &#x1f320;引用概念**引用**不是新定义一个变量&#xff0c;而是给**已存在变量取了一个别名**&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。>定义&#…

软件杯 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…