建造者模式

一、定义

  创建者模式: 将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。

二、创建对象的另一种形式

  工厂模式主要为了创建对象实例或者类簇(抽象工厂),关心的是最终产出(创建)的是什么。不关心创建的整个过程,仅仅需要知道最终创建的结果。

  建造者模式也是为了创建对象,但它更多关心创建这个对象的整个过程

 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设计模式》

原文地址:https://www.cnblogs.com/daheiylx/p/13840535.html