单体模式
单体模式是要给一个用来划分命名空间并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。
1、最简单的单体实际上就是一个对象字面量
var Singleton={
attr1:1,
arrt2:true,
fun1:function(){},
fun2:function(arg){}
}
2、可以作为命名空间,可以避免无意中改写代码,也有助于增强代码的文档性
var MyNamespace={
//不会被全局命名空间中声明的function1修改
function1:function(){}
}
var function1=function(){}
3、模块模式,可以拥有自己私有方法和属性
var MyNamespace.Singleton ={
//一般使用下划线表示私有成员
_privateMethod:function(){
return '';
},
//在公有成员内部调用私有成员
publicMethod:function(){
return this._privateMethod();
}
}
//使用闭包创建私有成员,任何声明在匿名函数中的变量或函数都只能被同一个闭包中声明的其他函数访问
//使用闭包,可以确保其私有成员不会在单体对象以外被使用
var MyNamespace.Singleton=function(){
var privateAttr=1; // private member
return { //public members
attr1:1,
method:function(){}
};
}()
使用闭包,可以确保其私有成员不会在单体对象以外被使用。
4、惰性实例化,对于不需要立即实例化的单体,可以将实例化推迟到需要使用它的时候,可以减少不必要的内存消耗(带宽消耗)。
var MyNamespace.Singleton=(function(){
var instance; //private attribute
function constructor(){
//所有的单体代码
var privateAttr; //private members
return { //public members
publicMethod:function(){}
}
}
//控制单体类实例化
// 如果该instance类已经被实例化,那么返回这个实例instance
return {
getInstance:function(){
if(!instance){
instance=constructor();
}
return instance;
}
}
})()
//调用
MyNamespace.Singleton.getInstance().publicMethod();
4、分支技术,把浏览器间的差异封装到在运行期间进行设置的动态方法中。
使用此技术,需要权衡执行速度和内存消耗。在运行时候,执行一次运行环境嗅探。
var MyNamespace.Singleton=(function(){
var objA={
method1:function(){}
};
var objB={
method1:function(){}
};
// 根据某种条件将其中之一赋给 MyNamespace.Singleton
return (someCondition) ? objA : objB;
})()