1、模式定义
单例模式,又被称为单体模式,是只允许实例化一次的对象类。比如我们用一个对象来规划命名空间,并井井有条地管理对象上的属性和方法。
单例模式,可能是JavaScript中最常见的一种设计模式了。这种模式经常用于为我们提供一个命名空间,比如jQuery库就使用了单例模式提供了一个命名空间 $ 。单例模式,是一种代码管理的优秀实践。
2、用单例模式提供一个独立的命名空间
// 单例模式(提供一个独立的命名空间)
var Xia = {
g: function(id){
return document.getElementById(id);
},
css: function(id,key,value){
this.g(id).style[key] = value;
},
attr: function(id,key,value){
this.g(id)[key] = value;
},
html: function(id,type,fn){
this.g(id)['on'+type] = fn;
}
}
3、单例模式可以让模块更加分明
单例模式除了可以提供独立的命名空间以外,还可以用来管理代码库中的多个模块。
// 单例模式的另一个作用:模块分明
baidu.dom.addClass // 添加新元素
baidu.dom.append // 插入元素
baidu.event.stopPropagation
baidu.event.preventDefault
baidu.string.trim
baidu.string.encodeHTML
// 用单例模式,自定义模块库
var A = {
Util: {
util_method1: function(){},
util_method2: function(){}
},
Tool: {
tool_method1: function(){},
tool_method2: function(){}
},
Ajax: {
get: function(){},
post: function(){}
},
Others: {
// ...
}
}
// 使用自己的模块
A.Util.util_method2();
A.Ajax.get();
4、用单例模式实现静态变量(不可改变的变量)
JavaScript语言没有提供 static 静态的变量。因此,在理论上讲,所有的JavaScript变量都可以被修改。如何代码示例,我们实现了静态变量功能,使得这些变量只能被访问而不能被修改。
// 用单例模式管理静态变量
var Conf = (function(){
// 不可修改的静态变量,其标识符通常都大写
var conf = {
MAX_NUM: 1000,
MIN_NUM: 1,
COUNT: 500
};
// 返回取值对象
return {
get: function(name){
return conf[name] ? conf[name] : null;
}
}
// 没有setter赋值器,我们就不能修改这些变量,即实现了静态变量的功能
})();
// 测试
var count = Conf.get('COUNT');
console.log(count);
5、惰性单例
有时候,对于单例对象需要被延迟创建,所以在单例模式中还存在一种延迟创建单例的形式,即“惰性单例”。
// 单例的延迟创建、惰性创建
var LazySingle = (function(){
// 单例实例的引用
var _instance = null;
// 单例
function Single(){
return {
publicMethod: function(){},
publicProperty: '1.0'
}
}
// 延迟创建单例
return function(){
if(!_instance){
_instance = Single();
}
return _instance;
}
})();
// 测试
console.log(LazySingle().publicProperty);
完!!!