建造者模式——笔记

建造者模式

  • 概念
    将一个复杂对象的构建层与其表示层相互分离,同样的构造过程可以采用不同的表示。

  • 使用及与工厂模式的区别
    比如说我们在网站上给别人推送一些简历的时候,我们就需要隐藏一些求职者的信息来获取利益,这时我们就需要抽象提取应聘者的部分信息,我们就可以试试建造者模式,所谓建造者模式是一种新的模式,他与之前的工厂模式有一定的区别,工厂模式主要是为了创建对象实例或者类簇(抽象工厂),关心的是最终创建的是什么,不关心创建的过程。然而建造者模式在创建对象时要更为复杂一些,虽然其目的也是为了创建对象,但是她更关心的是创建对象的过程,甚至于创建对象的每一个细节。就像我们在创建一个应聘者,不仅要关心创建一个人,还要关心这个人的一些细微的信息。

  • 建造者模式小例

      //创建一位人类
      var Human = function(param){
      	//技能
      	this.skill = param && param.skill || '保密';
      	//兴趣爱好
      	this.hobby = param && param.skill || '保密';
      }
      //类人原型方法
      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':
          	        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(setence){
      	this.workDescript = setence;
      }
    
      //创建一名应聘者
      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('小明', 'code');
      console.log(person.skill);//保密
      console.log(person.name.firstname);//小明
    

在这里我们创建了三个类,应聘者类、姓名解析类、期望职业类。我们对应聘者类传入的参数进行的处理,就是&&和||的运用。如:this.skill = param && param.skill || '保密';表示,如果存在param这个参数,并且该参数拥有skill属性就用这个属性赋值给this的skill属性,否则将用默认值“保密来设置。”

原文地址:https://www.cnblogs.com/yehui-mmd/p/6502634.html