媒介
设想形式填坑系列,紧接前文(间隔上次写笔记又过去了一个多月,我也不晓得怎样加班加着加着就一个月了-_-!)
正文
定义
工场形式是指供应一个建立对象的接口而不保存详细的建立逻辑,能够依据输入范例建立对象。让子类自行决定实例化哪种工场类,现实的建立对象历程在子类中举行。在建立类似子类的时刻,实行反复操纵。(认为我说的太笼统没紧要,立时就到举例子环节)
详细完成
前面的形貌能够照样稍显笼统,举个游戏内里的例子,我们须要完成一个临盆游戏角色的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 = "医治"
}
以上代码比较简单,来回忆下前文说道的几个特性:
- 运用者只须要晓得特定子类的称号就能够直接临盆对应的子类,无需晓得详细完成逻辑
- 现实的建立对象历程在子类中举行
- 在建立类似子类的时刻,实行反复操纵(每一个子类只做一次的继续)
补充一个实例
现实上,js的Object()
函数,就很相符工场形式的特性:
var n = Object(1)
n.constructor === Number
var s = Object('1')
n.constructor === String
var b = Object(true)
n.constructor === Boolean
小结
自我感觉设想形式系列因为照样处于进修阶段,实践经验相对较少,所以写起来照样倾向于读书笔记类,所以能够有许多处所都显得粗拙。权当作先占个坑,等后续有更深入明白再回来补上。
然后通例谢谢之前的热情读者,尤其是为我指出毛病的小伙伴。
然后依然是每次都一样的末端,假如内容有毛病的处所迎接指出;假如对你有协助,迎接点赞和珍藏,转载请征得赞同后着明出处,假如有题目也迎接私信交换,主页添加了邮箱地址~溜了