什么是建造者模式
建造者模式(Builder):将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
之前学过的工厂模式可以创建对象实例或者类簇(抽象工厂),关心的是最终创建哪种类型的类,而不关心创建的过程。但是在实际情况下,我们可能需要创建一个类,更加关注他的创建过程,比如创建一个人,我们创建的结果不仅仅是要得到人的实例,还要关注人的性别、爱好、衣着和职位等,换句话说,此时我们更加关注的是创建时类的细节。
创建者模式实例
// 创建一位人类
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 Name = function(name){
this.wholeName = name
if(name.indexOf(' ') > -1){
this.FirstName = name.slice(0,name.indexOf(' '))
this.SecondName = name.slice(name.indexOf(' '))
}
}
// 职位类
var Work = function(work){
var that = this;
(function(work,that){
if(work === 'code'){
that.work = '工程师'
that.workDescript = '沉迷代码,无法自拔'
}
if(work === 'UI'){
that.work = '设计师'
that.workDescript = '设计是一门艺术'
}
else{
that.work = Work
that.workDescript = '对不起,暂时无法找到对应的职位描述'
}
})(work,that)
}
// 更换期望的职位
Work.prototype.changeWork = function(work){
this.work = work
}
// 添加职位描述
Work.prototype.changeDescript = function(setence){
this.workDescript = setence
}
// 应聘者类,建造者模式
var Person = function(name,work,param){
var person = new Human(param)
person.name = new Name(name)
person.work = new Work(work)
return person
}
// 实例化一位应聘者
var Sheldon = new Person('Sheldon Zhou','UI',{
skill:'JavaScript、html、css',
hobby:'打篮球'
})
Sheldon.work.changeWork('code')
Sheldon.work.changeDescript('日夜操劳,难以为继!')
console.log(Sheldon)
在应聘者建造者模式中我们分成3个部分来创建以为应聘者,首先创建一个应聘者缓存对象person,缓存对象需要修饰(添加方法和属性),然后我们就项缓存对象添加姓名和职位两个属性,这样我们就得到一个完整的应聘者了。
建造者模式和工厂模式的区别
1)工厂模式建造的时一个对象,它追求的时创建的结果(何种类型的类的实例),我们创建时对创建的过程不得而知,只了解得到的创建结果对象。
2)建造者模式更加关心的时对象创建过程,因此我们通常将创建对象的类模块化,这样使被创建的类的每一个模块都可以得到灵活的引用与高质量的复用,当然我们最终的需求还是创建一个完整的个体,所以在进行拆分创建的整个过程后,我们将得到一个完整的实例。
3)建造者模式虽然可以模块化类,但是这种拆分同时也增加了整体对象类的结构复杂性,如果对象颗粒度很小(属性非常多),或者模块间的复用率很低并且变动不大,我们最好还是创建整体对象,不要使用建造者模式。