定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
如:登陆弹窗,全局只有唯一的一个实例。

  1. var CreateDiv=function(html){
  2. this.html=html
  3. this.init()
  4. }
  5. CreateDiv.prototype.init=function(){
  6. var div=document.createElement('div')
  7. div.innerHTML=this.html
  8. document.body.appendChild(div)
  9. }
  10. // 上面的类仅有创建一个div的功能
  11. // 使用代理类来实现单例模式
  12. var ProxySingletonCreateDiv=(function(){
  13. var instance
  14. return function(html){
  15. if(!instance){
  16. instance=new CreateDiv(html)
  17. }
  18. return instance
  19. }
  20. })() // new对构造函数的调用行为,如果函数不返回一个对象则new出一个实例对象,如果返回对象则new出这个对象
  21. var a=new ProxySingletonCreateDiv('a')
  22. var b=new ProxySingletonCreateDiv('b')
  23. console.log(a===b) // true

js中的单例模式

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

全局变量可以作为单例模式来使用,但是潜在问题较多。
使用命名空间可以减少全局变量的数量,感觉框架下一个文件也是一个命名空间。

惰性单例

惰性单例指的是在需要的时候才创建出对象实例。

惰性指在被使用的时候才被创建出来,是从时间维度上对程序运行时间的合理配置。

单一职责原则

一个方法只实现一种逻辑。

  1. var getSingleton=function(fn){ //负责管理单例的逻辑,传参fn只负责创建实例
  2. var result
  3. return function(){
  4. return result||result=fn.apply(this,arguments)
  5. }
  6. } // 也可以利用该函数来实现一些只执行一次的行为,本质上这个函数就是控制一个过程只执行一次
  7. var fn=function(){
  8. // some action
  9. return true // 或者得到的实例对象
  10. }

将创建对象和管理单例的职责逻辑分离为两种方法