# 单例模式

# 题目

设计一个类,我们只能生成该类的一个实例

# 概念

单例模式的核心是确保只有一个实例,并提供全局访问

其实在JavaScript中,单例模式并没有这么复杂,因为我们没有类,既然我们只要一个唯一的对象,为什么要创建“类”呢

var a = {}

我们这样创建了对象a,它确实独一无二 ,而且满足了单例模式的两个条件

  • 一个实例
  • 全局访问

但是全局变量很容易造成命名空间污染,如果项目很大的话,不小心覆盖了变量那就是致命的

# 适用场景

  1. 弹框的实现,全局缓存
  2. 遮罩层

# 代码

//获取单例
var getSingle = function(fn){
  var result;
  return function (){
      return result || (result=fn.apply(this,arguments));
  };
};

// 创建遮罩层
var createMask = singleton( function(){ 
  return document.body.appendChild( document.createElement('div') );  
})
1
2
3
4
5
6
7
8
9
10
11
12

调用 getSingle(createMssk)

通用的单例创建的例子就是通过封装一个getSingle需要实现单例模式的对象。而且只是会只创建一次。因为使用了 闭包的原因通过getSingle创建的result会在内存中一直存在不会销毁(除非页面关闭,或者手动释放)。

# 总结

单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对像,并且只创建唯一的一个。更奇妙的是,创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力。