面向对象程序设计中常用的一个模式。
1. 简介
单例设计模式(Singleton Pattern)
表现形式
var obj = {
xxx: xx,
...
}
在单例模式中,obj 不仅仅是对象名,它还被称为命名空间[NameSpace],把描述事物的属性存放到命名空间中,多个命名空间是独立分开的,互不冲突。
作用
把描述同一种事物的属性和特征进行 分组、归类(存储到同一个堆内存空间中),因此避免了全局变量之间的冲突和污染。
单例模式命名的由来
每一个命名空间都是 Object 类型的一个实例,而实例之间是相互独立、互不干扰的,所以我们称之为单例。
2. 最简单的单例
只使用基本类型描述一个人的时候:
var name = 'aa';
var age = 18;
var sex = 'girl';
var name = 'bb';
var age = 81;
var sex = 'boy';
当需要描述的人越来越多,命名必然会产生冲突。
因此需要使用对象来描述:
将描述相同的特征进行分组,减少全局变量的污染
var person1 = {
name: 'aa',
age: 18,
sex: 'girl'
}
var person2 = {
name: 'bb',
age: 81,
sex: 'boy'
}
普通的对象就是一个单例
3. 高级单例模式
高级单例模式,也可以称为模块模式,常用于模块开发。
模块模式使用了立即执行匿名函数,利用闭包,为单例模式创建私有变量。同时返回一个包含特权方法的对象。
从而本质上讲,返回的对象定义的是单例的公共接口。
var nameSpace = (function() {
var n = 12;
function fn() {
console.log(n);
}
return {
fn: fn
}
})();
由于普通的单例模式,没有隐私,谁都能看,谁都能改。有时我们需要保护自己的一些隐私,这时就需要高级单例模式
这种模式的好处:我们完全可以在这个私有作用域中创造很多内容(变量或函数),哪些需要供外面使用的,就暴露到返回的对象中(模块化实现的一种思想)。而外部访问不到内部定义的变量和函数,只能通过返回的对象访问。
高级单例模式有个缺点:会形成一个不销毁的作用域,始终占用内存,造成内存泄漏。
单例模式始终需要自己完整书写整个对象,属于手工模式。
4. 模块化开发
团队协作的时候,会把产品按照功能模块进行划分,每一个功能模块有专人负责开发
把各个版块之间公用的部门进行提取封装,后期再想实现这个功能,直接调取引用即可(模块封装)
//=> 使用单例模式进行封装
var skinRender = (function() {
var fn = function() {
};
return {
init: function() {
//=> 调取自己模块中的方法,直接调用就可以
//=> 调取其他模块中的方法,需要通过模块返回的对象中暴露的方法来调用
}
}
})();
skinRender.init();