1、模式定义
建造者模式,将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
2、对比 建造者模式和工厂模式
工厂模式(或抽象工厂)主要是为了创建对象实例或者类簇,该模式关心的是最终产出,即创建的结果是什么;该模式并不关心对象创建的整个过程,仅仅需要知道最终的创建结果即可。
建造者模式的目标任务也是创建对象,但该模式更多关心的是对象创建的整个过程,甚至关心到对象创建的每一个细节。比如用建造者模式创建一个“Person”的对象时,它不仅要得到Person的对象,还要深入到对象创建的过程中去,人应该穿什么衣服,男的还是女的,兴趣爱好什么等。
因此,建造者模式和工厂模式之间最大的区别在于,前者更关注对象创建的整个过程,而后者不会。
3、建造者模式 举例
// 人的相关描述
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;
}
})(work,that);
}
Work.prototype.changeWork = function(work){
this.work = work;
}
Work.prototype.changeDescript = function(setence){
this.workDescript = setence;
}
// 建造者模式:用3个类组合调用,创建出一个完整的Person类
// Person类由 Human / Named / 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('xiao ming', '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);
4、小结
建造者模式,不仅可以得到对象创建的结果,还参与了对象创建的具体过程,对对象创建的实现细节进行了更加细粒度的控制。建造者模式,创建的对象更为复杂,其结果是一个复合对象。
完!!!
网友评论