单例模式是设计模式中最为简单的一种,由名称可以初步感受到它的作用。
此模式会确保一个类只有一个实例,并提供一个它的全局访问点。
下面通过一个简单的代码实例来介绍一下它,代码如下:
<!doctype html>
<html>
<head>
<meta name="author" content="http://www.chajianwo.com/" />
<meta charset="UTF-8" />
<title>js单例模式</title>
<style type="text/css">
div{color:red}
</style>
</head>
<body>
<button id="bt">查看演示</button>
<script type="text/javascript">
var createDiv = (function () {
var div;
return function () {
if (!div) {
div = document.createElement('div');
div.innerHTML = '插件窝';
div.style.display = 'none';
document.body.appendChild(div);
}
return div;
}
})();
document.getElementById('bt').onclick = function () {
var odiv = createDiv();
odiv.style.display = 'block'
};
</script>
</body>
</html>无论点击多少次按钮,都会只生成一个div元素,代码还不够好,下面进行一下改造:
<!doctype html>
<html>
<head>
<meta name="author" content="http://www.chajianwo.com/" />
<meta charset="UTF-8" />
<title>js单例模式</title>
<style type="text/css">
div{color:red}
</style>
</head>
<body>
<button id="bt">登录</button>
<script type="text/javascript">
var getSingle = function(fn) {
var result;
return function() {
return result || (result = fn.apply(this, arguments));
}
}
//生成单例函数
var createDiv = getSingle(function() {
var div = document.createElement('div');
div.innerHTML = '我是登录弹出窗';
div.style.display = 'none';
document.body.appendChild(div);
return div;
})
document.getElementById('bt').onclick = function() {
var odiv = createLoginLayer();
odiv.style.display = 'block';
}
</script>
</body>
</html>将上管理单例的逻辑从原来的代码中抽离出来,封装在getSingle函数内部:
var getSingle= function(fn) {
var result;
return function() {
return result || (result = fn.apply(this, arguments));
}
}创建实例对象职责和管理单例职责分别放置在两个方法里,这两个方法可以独立变化互不影响。