08-单例模式
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;
}
}
【08-单例模式】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);
完!!!
推荐阅读
- 2019-08-29|2019-08-29 iOS13适配那点事
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 2018-08-29|2018-08-29 - 草稿 - 草稿
- 2019-08-16day20总结
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 记录20080526