<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>透明的单利模式</title>
</head>
<body>
</body>
<script type="text/javascript">
//用户从这个类中创建对象的时候,可以像使用其他任何普通类一样
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('seven1');
var b = new CreateDiv('seven2');
console.log(a === b); //true
/*为了把 instance 封装起来,我们使用了自执行的匿名函数和闭包,并且让这个匿名函数返回
真正的 Singleton 构造方法,这增加了一些程序的复杂度,阅读起来也不是很舒服
CreateDiv 的构造函数实际上负责了两件事情。第一是创建对象和执行初始
化 init 方法,第二是保证只有一个对象。虽然我们目前还没有接触过“单一职责原则”的概念,
但可以明确的是,这是一种不好的做法,至少这个构造函数看起来很奇怪
假设我们某天需要利用这个类,在页面中创建千千万万的 div,即要让这个类从单例类变成
一个普通的可产生多个实例的类,那我们必须得改写 CreateDiv 构造函数,把控制创建唯一对象
的那一段去掉,这种修改会给我们带来不必要的烦恼
*/
//用代理实现单利模式;解决上面的问题
var CreateDiv2 = function(html) {
this.html = html;
this.init();
}
CreateDiv2.prototype.init = function() {
var div = document.createElement('div');
div.innerHTML = this.html;
document.body.appendChild(div);
};
//引入代理类
var ProxySingleCreateDiv = (function() {
var instance;
return function(html) {
if(!instance) {
instance = new CreateDiv2(html);
}
return instance;
}
})()
var a1 = new ProxySingleCreateDiv('seven1');
var b1 = new ProxySingleCreateDiv('seven2');
console.log(a1 === b1);
</script>
</html>