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

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

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

建造者模式

把一个复杂对象的分离层和表示层分离,同样的构建过程可以采用不同的表示

应用场景

当一个构造函数的参数较多时使用,根据参数进行分类然后分别构建各个部分,最后挂载到对象的属性上。

实例:候选人

候选人对象具有人的基础属性,例如:姓名、年龄等,除了基础属性外还有工作属性。
工作属性还有其他的属性,例如:工作名称、种类、描述等。

为了简化候选人的构造,将其基础属性和工作属性分开,分别构建。以后需要扩展时也可以分别扩展互不影响。

function Candidate(param) {
  let _candidate = new Person(param);
  _candidate.work = new CreatedWork(param.work);
  return _candidate;
}

function Person(param) {
  this.name = param.name;
  this.age = param.age;
}

function CreatedWork(work) {
  switch (work) {
    case 'engineer':
      this.name = '工程师';
      this.description = '热爱编程';
      break;
    case 'teacher':
      this.name = '老师';
      this.description = '乐于分享';
      break;
    default:
      this.name = param.work;
      this.description = '无';
      break;
  }
}

CreatedWork.prototype.changeWork = function (work) {
  this.name = work;
}

CreatedWork.prototype.changeDes = function (des) {
  this.description = des;
}

优缺点

优点

  • 建造者模式的封装性很好:使用建造者模式可以有效地封装变化,在使用建造者模式的场景中,一般产品和建造这类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而言,可以取得较好的稳定性
  • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程结构,使得相同的创建过程可以创建不同的产品对象
  • 可以更加精细地控制产品的创建过程:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更加方便使用程序来控制创建过程
  • 建造者模式很容易进行扩展:如果有新的需求,通过实现一个新的建造这类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险,符合开闭原则

缺点

建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制

相关文章:

  • Roson的Qt之旅 #124 QNetworkConfigurationManager网络配置管理
  • 天池Python练习02-位运算
  • 国内主机整车EEA架构汇总
  • Java刷题面试系列习题(十三)
  • linux驱动35:工作队列
  • 句向量模型之SimCSE——Pytorch
  • 简单旅游景点HTML网页设计作品 DIV布局故宫介绍网页模板代码 DW家乡网站制作成品 web网页制作与实现
  • 图解redis(四)——高可用篇
  • LQ0048 交换瓶子【无标题】
  • 《SpringBoot篇》11.JPA常用注解只需一个表
  • 不想手敲代码?Jupyter Notebook 又一利器 Visual Python
  • 【mysql体系结构】InnoDB索引页结构
  • Roson的Qt之旅 #123 QNetworkConfigurationManager网络配置管理
  • 【数据结构与算法】ArrayList的模拟实现
  • Spring5源码之IOC的Bean管理之xml
  • SegmentFault for Android 3.0 发布
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • isset在php5.6-和php7.0+的一些差异
  • javascript 哈希表
  • JavaScript 一些 DOM 的知识点
  • JS笔记四:作用域、变量(函数)提升
  • node学习系列之简单文件上传
  • PAT A1092
  • PHP变量
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vim 折腾记
  • 百度地图API标注+时间轴组件
  • 关于springcloud Gateway中的限流
  • 猴子数据域名防封接口降低小说被封的风险
  • 离散点最小(凸)包围边界查找
  • 前端之React实战:创建跨平台的项目架构
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 优化 Vue 项目编译文件大小
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • scrapy中间件源码分析及常用中间件大全
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​flutter 代码混淆
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​业务双活的数据切换思路设计(下)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (11)MSP430F5529 定时器B
  • (C语言)fgets与fputs函数详解
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十六)一篇文章学会Java的常用API
  • (转)c++ std::pair 与 std::make
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET delegate 委托 、 Event 事件