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

news2024/10/1 15:29:31

文章目录

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

在这里插入图片描述

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

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

建造者的秘密

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

建造者有什么利与害?

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

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

建房涉及角色

  • 建筑师(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 设计模式之【单例】

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

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

相关文章

LeetCode[简单] 876. 链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 思路 对任意正整数 n,中间结点的编号可以表示成 ⌊2n​⌋1。 解法一 /*** Definition for singly-linked list.* public class L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

priority_queue优先级队列(堆)详解。C++经验+1

什么是堆 首先我们先了解什么是堆?堆分为大根堆和小根堆。但其实大根堆会让人误以为是不是大的元素在下面呢?为了防止错误想法,大根堆也可以叫大顶堆。 大顶堆:顶上元素最大,上一层比下一层元素大。 小顶堆&#xff…

AI搜索软件哪个好,AI搜索引擎工具分享

随着AI技术的发展,AI搜索引擎工具正逐渐成为我们信息获取的重要方法。下面小编就来和大家分享一些好用的AI搜索引擎软件,感兴趣的同学可以逐个使用体验一下。因为每个AI搜索引擎工具不同,建议大家搜索的时候可以多个工具搜索,然后…

.netcore nacos注册成功,服务列表找不到任何服务

命令空间id不要自动生成 .netcore 配置文件里,Namespace 配置命名空间id 而不是命名空间名称。

OrangePi 烧录镜像步骤

理解:第一步:烧录镜像。第二步:建立编译环境(一般是PC端的Linux虚拟机)和板卡端的文件连接。因为要传文件,一般用挂载的方法。第三步:软件程序的编译与部署。 第一步:烧录镜像步骤 …

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤: 什么是生命周期React类组…

AntFlow-Vue3 :一个仿钉钉流程审批,且满足99.8%以上审批流程需求的企业级工作流平台,开源且免费!

在现代企业管理中,流程审批的高效性直接影响到工作的流畅度与生产力。最近,我发现了一个非常有趣的项目—— AntFlow-Vue3 。这个项目不仅提供了一个灵活且可定制的工作流平台,还能让用户以可视化的方式创建和管理审批流程。 如果你是一名前…

10. 排序

一、排序的概念及引用 1. 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录…

Qt基础之四十七:管理员权限

在Windows系统中,以管理员身份运行的意思是,用系统管理最高权限运行程序。一般来说,只有当某些操作涉及系统保护区域时,才会需要用户授权管理员运行。如此一来,程序、命令在运行过程中,就有了足够权限,更改系统设置或注册表。 一.Qt程序加入管理员权限的几种方式 1.MS…

推荐一些免费下载恶意样本的网站

前一阵微步下载样本开始收费,算是又断了一个很好的白嫖途径。目前工作需求是不定期获取一批不同家族样本,看了看微步基础会员每天5次的下载限制,我默默把微步网页点了X,选择其他网站进行白嫖。 精确搜索 先列举出几个搜索比较简单…

【每天学个新注解】Day 6 Lombok注解简解(五)—@SneakyThrows

SneakyThrows 简化异常处理 并不建议日常开发中通过此注解解决异常捕获问题!!! 允许方法抛出检查型异常而无需显式声明或捕获这些异常。这对于那些不希望在方法签名中声明异常或不愿意编写复杂的 try-catch 块的场景非常有用。 使用 SneakyT…

vue绘制评论页面

<template><div><div class"conmment_box"><div class"my-reply"><div class"reply-info"><el-inputfocus"focusInput"type"textarea"placeholder"请输入内容"v-model"tex…

LaTeX 编辑器-TeXstudio

TeXstudio 是一款开源跨平台 LaTeX 编辑软件&#xff0c;界面与 Texmaker 类似。TeXstudio 为用户提供互动式拼写检查、代码折叠、语法高亮、代码提示和自动完成等特性&#xff0c;功能丰富&#xff0c;界面美观&#xff0c;但软件本身不提供底层功能&#xff0c;需要使用者自行…

Qualcomm AI Hub模型优化1: Whisper-Base-En导出及问题解决

1 从Qualcomm AI Hub Module中选择Whisper-Base-En模块部署 1.1 进入module虚拟环境 python3 -m venv qai_hub_models_env && source qai_hub_models_env/bin/activate1.2 使用pip安装高通音频转录包 pip install "qai_hub_models[whisper_base_en]" 1.3…

C语言 | Leetcode C语言题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; typedef struct {int start;int index; } Node;int cmp(const void *pa, const void *pb) {return ((Node *)pa)->start - ((Node *)pb)->start; }int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSiz…

网站建设中,JavaScript为什么现在可以做后台了?

JavaScript&#xff0c;作为一种最初为浏览器端脚本设计的语言&#xff0c;已经逐渐发展成为可以在服务器端运行的强大工具。以下是JavaScript可以做后台开发的原因分析&#xff1a; Node.js的崛起 事件驱动与非阻塞I/O&#xff1a;Node.js的事件驱动和非阻塞I/O模型使得JavaSc…

uniapp实现展示1个或多个文字标签,可点击切换选中、不选中的状态

前言 uni-tag是uni-app框架提供的一个标签组件&#xff0c;用于展示标签或者标记某个元素。它可以在视图中用来显示一组标签&#xff0c;并且支持自定义样式和事件。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 uni-notice-bar组件具有以下特点&…

利用千帆SDK实现作文自动批改

目录 作文批改实操 0. 环境准备 1. 大模型推理调用 1.1 Prompt 初探&#xff08;尝试到优化&#xff09; 1.2 Prompt 自动优化迭代&#xff08;APO&#xff1a;Automatic Prompt Optimization&#xff09; 1.3 推理超参优化&#xff08;autotuner&#xff09; 1.3.1 准备…

MATLAB案例 | 基于Copula的可靠度分析

本文详细介绍了Copula函数的绘制及在可靠度分析中的应用 各种类型Copula函数绘图完整代码例题1完整代码例题2完整代码各种类型Copula函数绘图 完整代码 clear clcy_gaussian = copularnd(gaussian, 0.9, 1000); y_t = copularnd(t, 0.91, 17.53,1000); y_Gumbel = copularnd(G…