js设想形式(二)-工场形式

媒介

设想形式填坑系列,紧接前文(间隔上次写笔记又过去了一个多月,我也不晓得怎样加班加着加着就一个月了-_-!)

正文

定义

工场形式是指供应一个建立对象的接口而不保存详细的建立逻辑,能够依据输入范例建立对象。让子类自行决定实例化哪种工场类,现实的建立对象历程在子类中举行。在建立类似子类的时刻,实行反复操纵。(认为我说的太笼统没紧要,立时就到举例子环节)

详细完成

前面的形貌能够照样稍显笼统,举个游戏内里的例子,我们须要完成一个临盆游戏角色的RoleMaker工场,到达以下目标:

var warrior = RoleMaker.factory('warrior')//临盆一个兵士
var mage = RoleMaker.factory('mage')//临盆一个法师
var priest = RoleMaker.factory('priest')//临盆一个牧师
warrior.introduce()// 输出 '我是一个兵士,我的专长是近战'
mage.introduce()// 输出 '我是一个法师,我的专长是魔法'
priest.introduce()// 输出 '我是一个牧师,我的专长是医治'

在这里,我们能够看到形如var warrior = RoleMaker.factory('warrior')的语句,就是运用RoleMaker工场临盆了一个兵士的历程,这里的兵士法师牧师都是角色的一个子类。

接下来就是怎样完成上面的RoleMaker类,最中心的头脑照样原型链继续(遗忘的同砚请自行补课,磨刀不误砍柴工),详细的完成代码以下:

  //父类
  function RoleMaker() {
    // 这里是父类的属性
  }

  RoleMaker.introduce = function () {
    return '我是一个' + this.type + ',我的专长是' + this.specialty
  }

  //工场要领
  RoleMaker.prototype.factory = function (type) {
    var role;
    // 这里我们直接把子类组织函数都保存在父类的静态属性中,如许的优点是不污染全局定名空间,同时轻易查找。现实上固然也能够直接用`switch-case`完成
    if (typeof (RoleMaker[type]) !== "function") {
      //对未指定子类的处置惩罚,这里是直接抛出毛病,也能够为未指定范例做默认值处置惩罚
      throw {
        name: 'Error',
        message: type + 'does not exist'
      }
    }
    if (typeof (RoleMaker[type].prototype.introduce !== "function")) {
      // 推断是不是已完成继续,注重只继续一次,固然因为只是原型链继续这里推断前提也能够用`RoleMaker[type].constructor===RoleMaker`
      RoleMaker[type].prototype = new RoleMaker()
    }

    role = new RoleMaker[type]() //实例化,也就是现实建立对象的历程
    return role
  }

  // 每一个子类的组织函数
  RoleMaker.warrior = function () {
    this.type = "兵士",
      this.specialty = "近战"
  }
  RoleMaker.mage = function () {
    this.type = "法师",
      this.specialty = "魔法"
  }
  RoleMaker.priest = function () {
    this.type = "牧师",
      this.specialty = "医治"
  }

以上代码比较简单,来回忆下前文说道的几个特性:

  1. 运用者只须要晓得特定子类的称号就能够直接临盆对应的子类,无需晓得详细完成逻辑
  2. 现实的建立对象历程在子类中举行
  3. 在建立类似子类的时刻,实行反复操纵(每一个子类只做一次的继续)

补充一个实例

现实上,js的Object()函数,就很相符工场形式的特性:

var n = Object(1)
n.constructor === Number
var s = Object('1')
n.constructor === String
var b = Object(true)
n.constructor === Boolean

小结

自我感觉设想形式系列因为照样处于进修阶段,实践经验相对较少,所以写起来照样倾向于读书笔记类,所以能够有许多处所都显得粗拙。权当作先占个坑,等后续有更深入明白再回来补上。
然后通例谢谢之前的热情读者,尤其是为我指出毛病的小伙伴。
然后依然是每次都一样的末端,假如内容有毛病的处所迎接指出;假如对你有协助,迎接点赞和珍藏,转载请征得赞同后着明出处,假如有题目也迎接私信交换,主页添加了邮箱地址~溜了

    原文作者:安歌
    原文地址: https://segmentfault.com/a/1190000015865576
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞