建造者模式
示例
描述
将一个复杂的对象构建层与其表示层相互分离, 同样的构建过程中可采用不同的表示. 建造者模式与工厂模式的不同之处在于, 它更多关心
创建对象的过程, 甚至于每一个创建对象的细节.
案例
有一批求职者到招聘网站发布自己的简历.要求:除了兴趣爱好可以发布在页面上, 个人联系方式不能发布, 要让需求公司找招聘平台.
需要找的工作可以分类.
分析明确创建内容:
创建用户信息如用户名等需要独立处理, 因为需要隐藏显示
应聘者需要独立创建, 因为他们代表一个整体
工作职位需要独立创建, 因为他们是应聘者拥有的一部分, 而且种类较多
实现
// 创建一位人类
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() {
var that = this;
// 构造器中通过传入的职位特征来设置相应职位以及描述
(function(work, that) {
switch(work) {
case 'code':
that.work = '工程师';
that.workDescript = '每天沉醉于编程';
break;
case 'UI':
// ...
case 'UE':
// ...
default:
that.work = work;
that.workDescript = '对不起, 我们还不清楚您所选择职位的相关描述';
}
})(work, that);
};
//更换期望的岗位
Work.prototype.changeWork = function(work) {
this.work = work;
};
// 添加对职位的描述
Work.prototype.changeDescript = function(setence) {
this.workDescript = setence;
};
/**
* 应聘者建造者
* 参数 name: 姓名
* 参数 work: 期望职位
*/
var Person = function(name, work) {
// 创建应聘者缓存对象
var _person = new Human();
// 创建应聘者姓名解析对象
_person.name = new Named(name);
// 创建应聘者期望职位
_person.work = new Work(work);
// 将应聘者对象返回
return _person;
};
// test:
var person = new Person('xiao ming', 'code');
console.log(person.skill); // 保密
console.log(person.name.FirstName); // xiao
console.log(person.work); // 工程师
console.log(person.work.workDescript); // 每天沉醉于编程
person.work.changeDescript('更改一下职位描述');
console.log(person.work.workDescript); // 更改一下职位描述
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。