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

javascript设计模式之建造者

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

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

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

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

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
}

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

/* 构建者
 * @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.kler.cn/a/231408.html

相关文章:

  • 数据结构(单向链表——c语言实现)
  • docker minio修改时区问题记录
  • OSRM docker环境启动
  • 集群聊天服务器(11)客户端开发
  • 编译OpenCV的速度,家里和公司的电脑相差很大
  • 英语中do(做没做)和can(有能力/资格做)的区分
  • matlab去图像畸变
  • 谷歌seo搜索引擎优化有什么思路?
  • 6个好看的wordpress模板
  • 忍者切水果
  • 14.0 Zookeeper环球锁实现原理
  • electron实现软件(热)更新(附带示例源码)
  • HTML 标签
  • 【Git版本控制 02】分支管理
  • re:从0开始的CSS学习之路 5. 颜色单位
  • 第五篇【传奇开心果系列】vant开发移动应用示例:深度解读高度可定制
  • MySQL-事务(TRANSACTION)
  • [技术杂谈]如何下载vscode历史版本
  • c#cad 创建-正方形(四)
  • 什么是数据库软删除,什么场景下要用软删除?(go GORM硬删除)
  • 编辑器Zed
  • leetcode 1539.第k个缺失的正整数
  • 信号的处理机制
  • Springboot使用kafka的两种方式
  • SQL 注入 - http头注入之UA头注入探测
  • 数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)