JavaScript中的单体模式四种实现方式

时间:2022-08-21 14:51:50
 /*
1 简单单体
*/
var Singleton = {
attr1: 1 ,
method1:function(){
//do sth
}
};
alert(Singleton.attr1);
Singleton.method1(); //单体模式一般用于划分命名空间 也就是区分是哪位开发人员的代码 例如
//张三工程师开发的代码
var Zhangsan = { };
//把张三的逻辑写在这里面
Zhangsan.Singleton = {
attr1:1,
method1:function(){
//do sth
}
}; /*
2 闭包单体: 闭包主要的目的是保护私有变量数据
*/
// 命名空间
var Zhangsan = {};
Zhangsan.Singleton = ( function(){
//私有变量和方法
var a = 1;
function f(){
//do sth
}
//返回单体对象
return {
attr1: a,
method1:function(){
return f();
}
};
})();
alert(Zhangsan.Singleton.attr1);
Zhangsan.Singleton.method1(); /*
3 惰性单体:(和闭包单体有相似的地方)
*/ var Zhangsan = {};
Zhangsan.Singleton = (function(){
//私有变量 控制返回的单体对象
var uniqInstance;
//初始化方法,控制返回的单体中有哪些东西
function init(){
//私有变量
var a = 10;
var fn = function(){
alert("fn");
};
return {
attr : a,
method : fn
};
} return {
getInstance:function(){ //如果有单体 则返回 否则创建一个返回
if(!uniqInstance){ //如果不存在
uniqInstance = init();
}
return uniqInstance;
}
};
})(); //调用惰性单体
alert(Zhangsan.Singleton.getInstance().attr); //
Zhangsan.Singleton.getInstance().method(); //fn /*
4 分支单体:判断程序分支 浏览器的差异检测
*/
var Zhangsan ={};
var different = true; //用于标记不同的浏览器
Zhangsan.Singleton = (function(){
var objA = { //a浏览器的内部配置
//属性、方法等
attr:"a",
method : function(){
alert("fn");
}
};
var objB = { //b浏览器的内部配置
//属性、方法等
};
return (different) ? objA:objB; //根据不同的浏览器 返回不同的对象
})(); alert(Zhangsan.Singleton.attr); //a

相关文章