zoukankan      html  css  js  c++  java
  • 建造者模式

    一、定义

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

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

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

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

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

  • 相关阅读:
    Unity游戏开发之AR增强现实技术入门
    python3快速入门
    大数据Hadoop入门到精通 (精品课程)
    JavaScript基础训练营
    我的超级工具
    html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域
    Centos7-驱动小米WIFI做AP
    rz快速上传文件到ssh服务器
    Ansible批量修改root密码
    ArcGIS API for JavaScript 入门教程[0] 目录
  • 原文地址:https://www.cnblogs.com/daheiylx/p/13840535.html
Copyright © 2011-2022 走看看