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,类似与搭建积木,一层一层的构建起来组合成一个模型