当前位置: 首页 > news >正文

TypeScript 设计模式之【建造者模式】

文章目录

  • **建造者模式**:打造你的梦想之屋
  • 建造者的秘密
    • 建造者有什么利与害?
    • 如何使用建造者搭建各种房子
    • 代码实现案例
    • 建造者模式的主要优点
    • 建造者模式的主要缺点
    • 建造者模式的适用场景
    • 总结

在这里插入图片描述

建造者模式:打造你的梦想之屋

假设你想要一栋完美的房子,里面有舒适的卧室、明亮的客厅、现代化的厨房,还有一个漂亮的花园。如果你自己来建,可能会手忙脚乱,不知从何下手。这就像是在代码中创建一个复杂的对象,如果所有细节都塞进一个超长的构造函数里,或者散布在代码的各个角落,那简直就是一场噩梦! 建造者模式就像是一位神奇的建筑大师,能够按照你的心意,一步步打造出你梦想中的房子。

建造者的秘密

建造者模式就像是聘请了一位专业的建筑师。他会把建房子的过程分解成一系列简单的步骤,比如打地基、砌墙、安装屋顶等。这样,你就不用亲自处理所有繁琐的细节了。

建造者有什么利与害?

建造者模式就像搭积木一样,可以一块一块慢慢来,不急于一时,用同样的建造步骤,可以盖出不同风格的房子,建筑师专注于建造,你只需要告诉他你想要什么样的房子就行。缺点就是需要雇佣更多的工人(增加更多的类),使得整个工程看起来更复杂。

如何使用建造者搭建各种房子

建房涉及角色

  • 建筑师(Builder):就像一份建房合同,列出了建造房子需要的所有步骤

  • 不同风格的建筑师,例如哥特式建筑师,罗马建筑师(GothicBuilder,RomanBuilder):每种风格的建造方法都不同

  • 工程总监(Director):负责协调整个建造过程,确保房子按照正确的顺序建造

建房步骤

  1. 建筑师负责设计建造房子的步骤

  2. 邀请不同建造风格的建筑师

  3. 工程总监指挥不同风格的建筑师建造房子

  4. 不同风格的房子建造完成

选择合适的建造者,你就能轻松打造出心目中的完美之屋!

代码实现案例


// 建筑师
interface Builder {// 重置房子reset(): void;// 建造墙buildWall(): void;// 建造门buildDoor(): void;// 建造窗户buildWindow(): void;// 建造屋顶buildRoof(): void;// 建造花园buildGarden(): void;// 得到房子getHouse(): void;}// 哥特式建筑师
class GothicBuilder implements Builder {// 重置房子reset(): void {console.log("Resetting Gothic House");}// 建造哥特式墙buildWall(): void {console.log("Building Gothic Wall");}// 建造哥特式门buildDoor(): void {console.log("Building Gothic Door");}// 建造哥特式窗buildWindow(): void {console.log("Building Gothic Window");}// 建造哥特式屋顶buildRoof(): void {console.log("Building Gothic Roof");}// 建造哥特式花园buildGarden(): void {console.log("Building Gothic Garden");}// 获取哥特式房子getHouse(): void {console.log("Gothic House");}
}// 罗马建筑师class RomanBuilder implements Builder {// 重置房子reset(): void {console.log("Resetting Roman House");}// 建造罗马墙buildWall(): void {console.log("Building Roman Wall");}// 建造罗马门buildDoor(): void {console.log("Building Roman Door");}// 建造罗马窗buildWindow(): void {console.log("Building Roman Window");}// 建造罗马屋顶buildRoof(): void {console.log("Building Roman Roof");}// 建造罗马花园buildGarden(): void {console.log("Building Roman Garden");}// 获取罗马房子getHouse(): void {console.log("Roman House");}
}// 工程总监
class Director {private builder: Builder | null = null;// 设置建筑师风格setBuilder(builder: Builder): void {this.builder = builder;}// 建造房子make(builder: Builder): void {if (this.builder) {this.builder.reset();this.builder.buildWall();this.builder.buildDoor();this.builder.buildWindow();this.builder.buildRoof();this.builder.buildGarden();}}
}// 工程总监
const director = new Director();
// 哥特式建筑风格
const gothicBuilder = new GothicBuilder();
// 罗马建筑风格
const romanBuilder = new RomanBuilder();// 哥特式房子
director.setBuilder(gothicBuilder);
director.make(gothicBuilder); // 输出  Building Gothic Wall Building Gothic Door Building Gothic Window Building Gothic Roof Building Gothic Garden
gothicBuilder.getHouse(); // 输出 Gothic House// 罗马房子
director.setBuilder(romanBuilder);
director.make(romanBuilder); // 输出 Resetting Roman House Building Roman Wall Building Roman Door Building Roman Window Building Roman Roof Building Roman Garden
romanBuilder.getHouse(); // 输出 Roman House

在这里插入图片描述

建造者模式的主要优点

  1. 封装性好,建造者模式将复杂对象的构建过程封装起来,客户端不需要了解具体的构建细节。

  2. 扩展性强,增加新的具体建造者,容易扩展新的产品类型。

  3. 控制细节,能够控制产品的构建过程,从而保证产品的质量。

  4. 易于使用,用清晰的方式来创建复杂对象,客户端代码更加简洁明。

建造者模式的主要缺点

  1. 需要创建多个具体建造者风格类,这样会增加系统的复杂度。

  2. 建造者模式需要客户端代码与具体建造者风格类进行交互,这增加了系统的耦合度。

建造者模式的适用场景

  1. 遇到创建复杂对象时,使用建造者模式来简化对象的创建过程。

  2. 需要创建的对象具有多个部分组成时,使用建造者模式来创建对象。

总结

建造者模式是一种创建型设计模式,将复杂对象的构建过程分解为多个简单步骤,代码更加简洁明了,它封装性好、扩展性强、易于控制细节,但也需要创建多个具体建造者类、增加系统的复杂度和耦合度。合理使用建造者模式,可以提高代码的可维护性和可扩展性。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告:TypeScript 设计模式之【单例】

相关文章:

  • C语言指针系列1——初识指针
  • 《算法岗面试宝典》正式发布
  • 生成式语言模型底层技术面试
  • 计算机网络发展
  • 极狐GitLab 17.4 重点功能解读【四】
  • Xcode16 iOS18 编译问题适配
  • Vue3+Element-UI Plus登录静态页
  • Vue极简入门
  • 【达梦数据库】存储过程统计模式下表信息-SQL改写
  • 微服务架构拆分策略与实践
  • 前后端分离集成CAS单点登录
  • Redis配置文件详解(上)
  • 【C++】——vector深度剖析模拟实现
  • 命名导出和默认导出的用法区别
  • RabbitMQ08_保证消息可靠性
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Apache的80端口被占用以及访问时报错403
  • Computed property XXX was assigned to but it has no setter
  • GitUp, 你不可错过的秀外慧中的git工具
  • gops —— Go 程序诊断分析工具
  • Java精华积累:初学者都应该搞懂的问题
  • js ES6 求数组的交集,并集,还有差集
  • Linux链接文件
  • Object.assign方法不能实现深复制
  • PhantomJS 安装
  • React-redux的原理以及使用
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 闭包--闭包作用之保存(一)
  • 第十八天-企业应用架构模式-基本模式
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (12)目标检测_SSD基于pytorch搭建代码
  • (152)时序收敛--->(02)时序收敛二
  • (9)STL算法之逆转旋转
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (七)Activiti-modeler中文支持
  • (七)Knockout 创建自定义绑定
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (算法)大数的进制转换
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (五)网络优化与超参数选择--九五小庞
  • (转)scrum常见工具列表
  • (转载)(官方)UE4--图像编程----着色器开发
  • ./configure、make、make install 命令
  • .bat批处理(一):@echo off
  • .bat文件调用java类的main方法
  • .NET CLR基本术语
  • .NET成年了,然后呢?
  • .NET单元测试使用AutoFixture按需填充的方法总结