一、定义
创建者模式: 将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
二、创建对象的另一种形式
工厂模式主要为了创建对象实例或者类簇(抽象工厂),关心的是最终产出(创建)的是什么。不关心创建的整个过程,仅仅需要知道最终创建的结果。
建造者模式也是为了创建对象,但它更多关心创建这个对象的整个过程。
1 // 建造者模式
2 // 创建一位人类
3 var Human = function(param) {
4 // 技能
5 this.skill = param && param.skill || '保密';
6 // 兴趣爱好
7 this.hobby = param && param.hobby || '保密';
8 }
9 // 人类原型方法
10 Human.prototype = {
11 getSkill: function() {
12 return this.skill;
13 },
14 getHobby: function() {
15 return this.hobby;
16 }
17 }
18 // 实例化姓名类
19 var Named = function(name) {
20 var that = this;
21 // 构造器
22 // 构造函数解析姓名的姓与名
23 (function(name, that) {
24 that.wholeName = name;
25 if(name.indexOf(' ') > -1) {
26 that.FirstName = name.slice(0, name.indexOf(' '));
27 that.secondName = name.slice(name.indexOf(' '));
28 }
29 })(name, that);
30 }
31 // 实例化职位类
32 var Work = function(work) {
33 var that = this;
34 // 构造器
35 // 构造函数中通过传入的职位特征来设置相应职位以及描述
36 (function(work, that) {
37 switch(work) {
38 case 'code':
39 that.work = '工程师';
40 that.workDescript = '每天沉醉于编程';
41 break;
42 case 'UI':
43 case 'UE':
44 that.work = '设计师';
45 that.workDescript = '设计更似一种艺术';
46 break;
47 case 'teach':
48 that.work = '教师';
49 that.workDescript = '分享也是一种快乐';
50 break;
51 default:
52 that.work = work;
53 that.workDescript = '对不起,我们还不清楚您所选择职位的相关描述'
54 }
55 })(work, that);
56 }
57 // 更换期望的职位
58 Work.prototype.changeWork = function(work) {
59 this.work = work;
60 }
61 // 添加对职位的描述
62 Work.prototype.changeDescript = function(setence) {
63 this.workDescript = setence;
64 }
解析:
(1)&&与||的运用
param && param.skill || '保密':如果存在param这个参数,并且param拥有skill属性,就用这个属性赋值给this的skill属性,否则将用默认值‘保密’
三、创建一个对象
1 /**
2 * 应聘者创建者
3 * 参数 name: 姓名(全名)
4 * 参数 work:期望职位
5 */
6 var Person = function(name, work) {
7 // 创建应聘者缓存对象
8 var _person = new Human();
9 // 创建应聘者姓名解析对象
10 _person.name = new Named(name);
11 // 创建应聘者期望职位
12 _person.work = new Work(work);
13 // 将创建的应聘者对象返回
14 return _person;
15 }
16 // 测试类
17 var person = new Person('xiao ming', 'code');
18 console.log(person.skill); // 保密
19 console.log(person.name.FirstName); // xiao
20 console.log(person.work.work); // 工程师
21 console.log(person.work.workDescript); // 每一天在编程中度过
22 person.work.changeDescript('更改一下职位描述!');
23 console.log(person.work.workDescript); // 更改一下职位描述!
参考资料:《JavaScript设计模式》