建造者模式
将一个复杂对象的构建层与其表现层相互分离,同样的构建过程可采用不同的表示。
建造者模式与工厂方法不同,工厂方法是对一个类或则一个类簇进行创建,而建造者模式是根据将具体的对象通过不同的表现形式进行创建。
//创建一位人类
var Human = function (param) {
this.skill = param && param.skill || '保密';
this.hobby = param && param.hobby || '保密';
}
Human.prototype = {
getSkill: function () {
return this.skill;
},
getHobby: function () {
return this.hobby;
}
}
// 实例化姓名类
var Named = function (name) {
var that = this;
// 构造器
// 构造函数解析姓名的姓与名
(function (name, that) {
that.wholeName = name;
if (name.indexOf(' ') > -1) {
that.FirstName = name.slice(0, name.indexOf(' '));
that.SecondName = name.slice(name.indexOf(' '));
}
})(name, that);
}
// 实例化职位类
var Work = function (work) {
let that = this;
(function (work, that) {
switch (work) {
case 'code':
that.work = '工程师';
that.workDescript = '每天都沉醉于编程';
break;
case 'UI':
case 'UE':
that.work = '设计师';
that.workDescript = '设计更似一种艺术';
break;
case 'teach':
that.work = '教师';
that.workDescript = '分享也是一种快乐';
break;
default:
that.work = work;
that.workDescript = '对不起,我们还不清楚你选择职位的相关描述'
break;
}
})(work, that)
}
// 更换期望的职位
Work.prototype.changeWork = function (work) {
this.work = work;
}
// 添加对工作的描述
Work.prototype.changeDescript = function (setence) {
this.workDescript = setence;
}
// 创建一位应聘者
var Person = function (name, work) {
var _person = new Human();
_person.name = new Named(name);
_person.work = new Work(work);
return _person;
}
// 测试代码
var person = new Person('小 明', 'code');
console.log(person.skill); // 保密
console.log(person.name.FirstName); // 小
console.log(person.work.work); // 工程师
console.log(person.work.workDescript);// 每天都沉醉于编程
person.work.changeDescript('更改一下职位描述');
console.log(person.work.workDescript); // 更改一下职位描述
总结
建造者模式不仅仅可得到创建的结果,然而也参与了创建的具体过程,对于创建的具体实现的细节也参与了干涉,可以说创建的对象更复杂,所创建的对象是一个复合对象。