《JavaScript设计模式》章5--单体模式
单体的基本结构
好气,之前写了好久的东西由于公司停电全没了,这篇全部是重写的。。。就当温故知新了吧...
var Singleton = {
attribute1: true,
attribute2: 10,
method1: function() {...},
method2: function(arg) {...}
}
划分命名空间
var nameSpace = {
findProduct: function() {...}
}
//这里的findProduct不会覆盖前面的,因为前面的是通过nameSpace.findProduct()进行访问
var findProduct = 1
拥有私有成员的单体
使用下划线表示私有
这种形式的私有性完全靠自觉
var mySingle = {
//公有成员
attribute_one: 1,
//私有成员,下划线开头
_attribute_two: true
}
使用闭包实现私有
基本思路就是使用立即执行函数来返回一个对象字面量
var mySingle = (function() {
//这里定义的成员是私有的
var attribute_me = false
//方法也可以私有
function_me: function() {...}
return {
//公共成员可以在这里暴露出去
attribute_pub: 1,
//可以暴露出操作私有成员的公共方法例如setName, getName等
...
}
})()
惰性实例化单体
思路:把前面立即执行的函数中的逻辑封装成一个构造函数,然后返回一个公用的实例化方法来调用构造函数
//这里使用dx来代表“惰性”...
var mySingle_dx = (function() {
constructor: functionn() {
//之前的代码,就是相当于把直接的return转换成调用constructor()才返回
...
}
//将实例化的方法暴露出去
return {
getInstance: function() {
return constructor()
}
}
})()
真正的体现“单体”
我们在前面代码的基础上需要做到: 未实例化返回新实例,否则返回已有实例
//这里使用dx来代表“惰性”...
var mySingle_dx = (function() {
constructor: functionn() {
//之前的代码,就是相当于把直接的return转换成调用constructor()才返回
...
}
//在这里新增一个私有属性来标记是否已经被实例化
var uniqueInstance;
//将实例化的方法暴露出去
return {
getInstance: function() {
//根绝实例化的情况作出不同的处理
if(!uniqueInstance) {
uniqueInstance = constructor()
}
return uniqueInstance;
}
}
})()
分支
思路: 在我们前面之间返回一个对象的思路基础上,根据业务条件声明好多个(类似的)对象字面量,但最终只返回其中满足条件的一个
var mySingle_branch = (function() {
var objA = {
//定义属性和方法
}
var objB = {
//定义属性和方法
}
return (someConditions) ? objA : objB
})()

浙公网安备 33010602011771号