工厂模式主要是为了创建对象实例或者类簇(抽象工厂)关心的是最终产出(创建)的是什么。
不关心你创建的整个过程,仅仅需要知道你最终创建的结果。
然而建造者模式在创建对象时更为复杂一些,虽然其目的也是为了创建对象,但是它更关心的是创建这个对象的整个过程,甚至于创建对象的每一个细节。
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) {var 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 = '暂无查询到相关职位描述';}})(work, that)}// 更换期望的职位Work.prototype.changeWork = function(work) {this.work = work;}// 添加对职位的描述Work.prototype.changeDescript = function(sentence) {this.workDescript = sentence;}
这样我们就创建了抽象出来的 3 个类——应聘者类、姓名解析类和期望职位类。
这样我们写一个建造者类,在建造者类中我们要通过对这 3 个类组合调用,就可以创建出一个完整的应聘者对象。
// 应聘者建造类// 参数 name: 姓名(全名)// 参数 work: 期望职位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('zhang kai', 'code');console.log(person.skill); // 保密console.log(person.name.firstName); // zhangconsole.log(person.work.work); // 工程师console.log(person.work.workDescript); // 每天沉醉于编程person.work.changeDescript('更改职位描述');console.log(person.work.workDescript); // 更改职位描述
