javascript设计模式之建造者

news/2024/6/18 21:55:30 标签: javascript, 前端, 开发语言

工厂模式不关心过程,只关心结果,这与建造者相反,建造者更关心的是过程,

这里我们创建一个基类,其拥有技能跟爱好两个属性,还有两个实例方法用来获取技能跟爱好

javascript">// 基类
let Human = function (param = {}) {
  this.skill = param.skill || "保密"
  this. Hobby = param.hobby || "无"
}
// 基类原型
Human.prototype = {
  getSkill() {
    return this.skill
  },
  getHobby() {
    return this. Hobby
  }
}

接下来创建一个姓名类及工作类

javascript">let Named = function (name = "") {
  let _this = this
    (function (name, self) {
      self.name = name
      if (name.indexOf(" ") !== -1) {
        self.firstName = name.slice(0, name.indexOf(" "))
        self.lastName = name.slice(name.indexOf(" "))
      }
    })(name, _this)
}

let Work = function (work = "") {
  let _this = this
    (function (work, self) {
      self.work = work
      switch (work) {
        case "code":
          self.work = "工程师"
          self.description = "每天沉醉于编程的工程师"
          break
        case "UI":
        case "UE":
          self.work = "设计师"
          self.description = "UI和UE的设计"
          break
        default:
          self.work = work
          self.desc = "unknown"
      }
    })(work, _this)
}

Work.prototype.changeWork =  (work)=> {
  this.work = work
}
Work.prototype.changeDescription = (description) => {
  this.description = description
}

这样我们就得到了姓名跟工作的类,再来创造一个应聘者:

javascript">/* 构建者
 * @param {string} name 姓名
 * @param {string} work 工作
 */
let Person = function (name, work) {
  let _person = new Human()
  _person.name = new Named(name)
  _person.work = new Work(work)
  return _person
}

// 这样使用
let person = new Person("于光豪", "code")
console.log(person.work.description) // 每天沉醉于编程的工程师
person.work.changeDescription('不要想着工程师很轻松!')
console.log(person.work.description) // 不要想着工程师很轻松!
console.log(person.name.name) // 于光豪

由此可以看出在构建者中,创建者不单单是在乎结果,更关注过程,构建的对象来说更为复杂,工作通过 Switch 来区分不同的工作种类,对于不同的职位进行不同的操作。不过针对工厂模式来说,构建者的确更明确一些,它将所有功能等都逐一分开,每个都独立,再通过一个构建者将所有的基层都融合在一起(Person)构建者融合了 Human、Named、Work,类似与搭建积木,一层一层的构建起来组合成一个模型


http://www.niftyadmin.cn/n/5362893.html

相关文章

【ASP.NET Core 基础知识】--Web API--RESTful设计原则

一、简介 RESTful设计的背景源于Roy Fielding博士在他2000年的博士论文中提出的REST(Representational State Transfer)架构风格。REST旨在构建可伸缩、可维护的网络应用,强调资源的统一标识、无状态通信和统一接口。基于HTTP协议&#xff0…

重写Sylar基于协程的服务器(5、IO协程调度模块的设计)

重写Sylar基于协程的服务器(5、IO协程调度模块的设计) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、…

MySQL基础查询篇(4)-INNER JOIN和OUTER JOIN的区别

MySQL数据库中的INNER JOIN和OUTER JOIN是两种常用的连接查询操作,用于联合多张表中的数据。本文将详细介绍它们的区别和示例用法。 INNER JOIN INNER JOIN(内连接)是连接查询中最常见的一种方式。它基于两个或多个表之间的共同字段&#x…

分布式(一)Redis的数据结构

五种数据结构 String 结构 字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [key ...] //批量获取字…

寒假 day1

1、请简述栈区和堆区的区别? 2、有一个整形数组:int arr[](数组的值由外部输入决定),一个整型变量: x(也 由外部输入决定)。要求: 1)删除数组中与x的值相等的元素 2)不得创建新的数组 3)最多只允许使用单层循环 4)无需考虑超出新数组长度后面的元素,所以…

app逆向-frida-rpc详解

Frida-RPC是Frida工具的一个组件,用于在应用程序和Frida脚本之间进行远程过程调用(RPC)。远程过程调用是一种允许应用程序的不同部分或不同的应用程序之间进行通信的方法。在Frida中,RPC通过JavaScript脚本和应用程序之间建立通信…

Rust 第一个rust程序Hello Rust️

文章目录 前言一、vscode 安装rust相关插件二、Cargo New三、vscode调试rustLLDB 前言 Rust学习系列。今天就让我们掌握第一个rust程序。Hello Rust 🦀️。 在上一篇文章我们在macOS成功安装了rust。 一、vscode 安装rust相关插件 以下是一些常用的 Rust 开发插件…

编程笔记 html5cssjs 077 Javascript 关键字

编程笔记 html5&css&js 077 Javascript 关键字 一、关键字二、Javascript关键字注意 在计算机编程语言中,关键字(Keyword)是指那些被编程语言赋予特殊含义、具有预定义用途的保留字。这些词汇不能用作变量名、函数名或其他标识符&…