首页 > 代码库 > JavaScript设计模式与开发实践-读书笔记(4)单例模式
JavaScript设计模式与开发实践-读书笔记(4)单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1.实现单例模式
要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。
var Singleton = function(name){ this.name = name; this.instance = null; }; Singleton.prototype.getName = function(){ alert(this.name); }; Singleton.getInstance = function(name){ if(!this.instance){ this.instance = new Singleton(name); } return this.instance; }; var a = Singleton.getInstance(‘sven1‘); var b = Singleton.getInstance(‘sven2‘); alert(a === b); //true
或者:
var Singleton = function(name){ this.name = name; }; Singleton.prototype.getName = function(){ alert(this.name); }; Singleton.getInstance = (function(){ var instance = null; return function(name){ if(!instance){ instance = new Singleton(name); } return instance; } })(); var a = Singleton.getInstance(‘sven1‘); var b = Singleton.getInstance(‘sven2‘); alert(a === b); //true
我们通过Singleton.getInstance来获取Singleton类的唯一对象,这种方式相对简单,但是有一个问题,增加了这个类的"不透明性"。
这段单例模式代码的意义并不大。
2.透明的单例模式
我们现在的目标是实现一个"透明"的单例类,用户从这个类中创建对象的时候,可以像使用其他任何普通类一样。
var CreateDiv = (function(){ var instance; 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; })(); var a = new CreateDiv(‘sven1‘); var b = new CreateDiv(‘sven2‘); alert(a === b);
但它同样有一些缺点。
CreateDiv的构造函数实际上负责了两件事情。第一是创建对象和执行初始化方法init方法,第二是保证只有一个对象。违背了"单一职责原则"。
3.用代理实现单例模式
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 ProxySingletonCreateDiv = (function(){ var instance; return function(html){ if(!instance){ instance = new CreateDiv(html); } return instance; } })(); var a = new ProxySingletonCreateDiv(‘sven1‘); var b = new ProxySingletonCreateDiv(‘sven2‘); alert(a === b);
JavaScript设计模式与开发实践-读书笔记(4)单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。