定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点

普通的单例模式:
  使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象。
比如:使用一个变量instance标记是否创建了这个类对象,现在需要用到一个Single类,先判断instance是否为null,若不是则直接return返回,若是则new Singleton();

var instance = null;
return function(){
if(!instance){
instance = new Singleton();
}
return instance;
}

JavaScript中,我们经常会把全局变量当成单例来使用,但全局变量容易造成命名空间污染,使用命名空间可以减少全局变量的数量。

我们常在管理命名空间时使用单例模式,它可以降低你在代码中创建全局变量的数量。

惰性单例:在需要的时候才创建对象实例。(非常有用)
通用的惰性单例:
  首先是管理单例逻辑封装在getSingle中,创建对象的方法fn被当作参数动态传入

var getSingle = function(fn){
var result;
return function(){
return result || (result = fn.apply(this,arguments));
}
};

fn可以是创建弹窗的方法createDialog或者其他方法,传入getSingle后,返回一个新的函数,并且用一个变量result保存fn的结果,因为result在闭包中,所以它永远不会被销毁,如果result已经被赋值,那么它将返回这个值。

var createDialog = function(){
//创建Dialog代码
}
document.getElementById("btn").onclick = function(){
var dialogLayer = getSingle(createDialog);//这样创建好Dialog了
}

把创建实例对象和管理对象分别放置在两个方法里,这两个方法可以独立变化而互不影响,减低耦合。这两个方法组合起来才具有单例模式的神奇作用
这种单例模式的用途不止创建对象,可以用于“一次绑定事件”,还有其他。。

最新文章

  1. fluent-ffmpeg 常用函数
  2. github.com使用方法
  3. js,格式化long类型日期封装
  4. Spring Security3学习实例
  5. CGI综述
  6. [GraphQL] Serve a GraphQL Schema as Middleware in Express
  7. vs常用调试快捷键
  8. 了解 JavaScript 中的内置对象
  9. Swift入门篇-Hello World
  10. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器
  11. js生成随机字符串或者随机数
  12. 我的hibernate学习记录(一)
  13. logback使用配置详解
  14. recurrent model for visual attention
  15. openstack项目【day23】:keystone组件网关协议
  16. ArcGIS Pro玩转BIM应用浅谈
  17. python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
  18. 中间件RabbitMQ之运维篇
  19. win7访问局域网总提示用户名密码错误解决方案
  20. 【MarkMark学习笔记学习笔记】javascript/js 学习笔记

热门文章

  1. python学习7
  2. 如何把select默认的小三角替换成自己的图片
  3. [LeetCode] Best Time to Buy and Sell Stock 买卖股票的最佳时间
  4. 安卓 Handler
  5. ajax的简单介绍
  6. bzoj 1391
  7. Beta阶段第八次Scrum Meeting
  8. log4j的配置
  9. BZOJ1492: [NOI2007]货币兑换Cash
  10. laypage分页