摘要:单例模式定义保证一个类只有一个实例,并提供一个访问它的全局访问点。或者使用类时,我们必须知道它是一个单例类,跟以往出一个新对象的方式不同,这里要使用来获取对象。
单例模式 定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点。
var single = function(name){ this.name = name; this.instance = null; } single.prototype.getName = function(){ alert(this.name) } single.getInstance = function(name){ if(!this.instance){ this.instance = new single(name) } return this.instance } var a = new single.getInstance("ffff"); var a2 = new single.getInstance("zzzz"); // a == a2 => true
或者
var single = function(name){ this.name = name; } single.prototype.getName = function(){ console.log(this.name) } single.getInstance = (function(){ var instance = null; return function(name){ if(!instance){ instance = new single(name) } return isntance } })()
使用single类时,我们必须知道它是一个单例类,跟以往new出一个新对象的方式不同,这里要使用single.getInstance来获取对象。
透明的单例var createDiv = (function(){ var instance = null; var createDiv = function(html){ if(instance) return instance this.html = html; this.init() return instance = this; } createDiv.prototype.init = function(){ var div = document.createElement("div") div.innerHTML = this.html; document.body.appendChild(div) } return createDiv })()
这个透明类的单例,我们使用了自执行函数和闭包,并且让这个匿名函数返回真正的single构造方法,增加了代码的复杂度,读起来需要一定的时间来理解
构造函数的作用,实际上做了两件事,创建对象和执行初始化init方法,第二保证了只有一个对象
用代理来实现单例模式var createDiv = function(html){ this.html = html; this.init(); } createDiv.prototype.init = function(){ var div = document.createElement("div"); div.innerHTML = this.html; document.body.appendChild(div); }
引入代理类
var proxySingle = (function(){ var instance; return function(html){ if(!instance){ instance = new createDiv(html) } return instance } })()
通过代理模式完成的代码,我把管理单例的逻辑移到了proxySingle里,这样createDiv就变成了一个普通的类
这个例子是缓存代理的应用之一。
惰性单例惰性单例指的是在需要的时候才创建对象实例。
这种技术在实际开发中非常有用。
在网站首页,有个登陆按钮,点击登录 弹出登录框。很明显这个登录框在页面中是唯一的,不会也不可能出现两个登陆框。
首先我们可以页面加载完成时就加载这个登录框,此时这个登录框出于隐藏状态。
但是如果我进入页面只是想看看,不想进行一些需要登陆的业务操作,此时登陆框的dom节点存在是没有意义的,是一种浪费。
此时,单例模式就更实用了
//dom //js var createLogin = (function(){ var div; return function(){ if(!div){ div= document.createElement("div"); div.innerHTML = "i"m login form"; div.display.style="none"; document.body.appendChild(div); return div } } })() document.getElementById("login").onClick = function(){ var loginDom = createLogin(); loginDom.display.style ="block" }通用惰性单例
我们参考上边的代码,如果需要在创建一个iframe单例,或者其他标签,难道需要把上边的函数重新copy一份修改.单例的逻辑可以抽象出来,并且始终不变的,可以理解为
var instance; if(!instance){ instance = xxx操作 } return instance
我们将管理单例的逻辑抽象封装起来getInstance
var getInstance = function(fn){ var instance; return function(){ return instance || (result = fn.apply(this,arguments)) } } //创建登陆 var createLogin = getInstance(function(){ var div = document.createElement("div"); div.innerHTML = "我是的登陆"; div.style.display = "none"; document.body.appenChild(div); return div }) // $("#login").on("click",function(){ var login = createLogin(); $(login).show() }) //创建script var createScript = getInstance(function(){ var script = document.createElement("script"); document.appendChild(script) return script }) $("#loadScript").on("click",function(){ var script = createScript(); $(script).show(); })
将创建实例对象的职责和管理单例的职责分别放置在两个方法里,这两个方法独立,不会互相影响。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80736.html
摘要:总结单例是运用频率很高的模式,因为客户端没有高并发的情况,选择哪种方式并不会有太大的影响,出于效率考虑,推荐使用和静态内部类实现单例模式。 单例模式介绍 单例模式是应用最广的模式之一,也可能是很多人唯一会使用的设计模式。在应用单例模式时,单例对象的类必须保证只用一个实例存在。许多时候整个系统只需要一个全局对象,这样有利于我么能协调整个系统整体的行为。 单例模式的使用场景 确保某个类有且...
摘要:不符合设计模式中的单一职责的概念。引入代理实现单例模式引入代理实现单例模式的特点我们负责管理单例的逻辑移到了代理类中。的单例模式对比在以上的代码中实现的单例模式都混入了传统面向对象语言的特点。 声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记 1.单例模式的特点和定义 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。 2.传统面向对...
摘要:如果需要防范这种攻击,请修改构造函数,使其在被要求创建第二个实例时抛出异常。单例模式与单一职责原则有冲突。源码地址参考文献设计模式之禅 定义 单例模式是一个比较简单的模式,其定义如下: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 或者 Ensure a class has only one instance, and provide a global point of ac...
摘要:在设计模式一书中,将单例模式称作单件模式。通过关键字,来保证不会同时有两个线程进入该方法的实例对象改善多线程问题为了符合大多数程序,很明显地,我们需要确保单例模式能在多线程的情况下正常工作。 在《Head First 设计模式》一书中,将单例模式称作单件模式。这里为了适应大环境,把它称之为大家更熟悉的单例模式。 一、了解单例模式 1.1 什么是单例模式 单例模式确保一个类只有一个实例,...
阅读 2027·2019-08-30 15:52
阅读 2390·2019-08-29 18:37
阅读 770·2019-08-29 12:33
阅读 2812·2019-08-29 11:04
阅读 1497·2019-08-27 10:57
阅读 2066·2019-08-26 13:38
阅读 2739·2019-08-26 12:25
阅读 2409·2019-08-26 12:23