面向对象程序设计中常用的一个模式。

1. 简介

单例设计模式(Singleton Pattern)

表现形式

  1. var obj = {
  2. xxx: xx,
  3. ...
  4. }

在单例模式中,obj 不仅仅是对象名,它还被称为命名空间[NameSpace],把描述事物的属性存放到命名空间中,多个命名空间是独立分开的,互不冲突。

作用
把描述同一种事物的属性和特征进行 分组、归类(存储到同一个堆内存空间中),因此避免了全局变量之间的冲突和污染。

单例模式命名的由来
每一个命名空间都是 Object 类型的一个实例,而实例之间是相互独立、互不干扰的,所以我们称之为单例。

2. 最简单的单例

只使用基本类型描述一个人的时候:

  1. var name = 'aa';
  2. var age = 18;
  3. var sex = 'girl';
  4. var name = 'bb';
  5. var age = 81;
  6. var sex = 'boy';

当需要描述的人越来越多,命名必然会产生冲突。

因此需要使用对象来描述:
将描述相同的特征进行分组,减少全局变量的污染

  1. var person1 = {
  2. name: 'aa',
  3. age: 18,
  4. sex: 'girl'
  5. }
  6. var person2 = {
  7. name: 'bb',
  8. age: 81,
  9. sex: 'boy'
  10. }

普通的对象就是一个单例

3. 高级单例模式

高级单例模式,也可以称为模块模式,常用于模块开发。

模块模式使用了立即执行匿名函数,利用闭包,为单例模式创建私有变量。同时返回一个包含特权方法的对象。

从而本质上讲,返回的对象定义的是单例的公共接口。

  1. var nameSpace = (function() {
  2. var n = 12;
  3. function fn() {
  4. console.log(n);
  5. }
  6. return {
  7. fn: fn
  8. }
  9. })();

由于普通的单例模式,没有隐私,谁都能看,谁都能改。有时我们需要保护自己的一些隐私,这时就需要高级单例模式

这种模式的好处:我们完全可以在这个私有作用域中创造很多内容(变量或函数),哪些需要供外面使用的,就暴露到返回的对象中(模块化实现的一种思想)。而外部访问不到内部定义的变量和函数,只能通过返回的对象访问。

高级单例模式有个缺点:会形成一个不销毁的作用域,始终占用内存,造成内存泄漏。

单例模式始终需要自己完整书写整个对象,属于手工模式。

4. 模块化开发

  • 团队协作的时候,会把产品按照功能模块进行划分,每一个功能模块有专人负责开发

  • 把各个版块之间公用的部门进行提取封装,后期再想实现这个功能,直接调取引用即可(模块封装)

  1. //=> 使用单例模式进行封装
  2. var skinRender = (function() {
  3. var fn = function() {
  4. };
  5. return {
  6. init: function() {
  7. //=> 调取自己模块中的方法,直接调用就可以
  8. //=> 调取其他模块中的方法,需要通过模块返回的对象中暴露的方法来调用
  9. }
  10. }
  11. })();
  12. skinRender.init();