单利模式提供了一种将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一变量进行访问。
单利模式的优点是:
可以用来划分命名空间,减少全局变量的数量
使用单例模式可以使代码组织的更为一致,使代码容易阅读和维护。
可以被实例化,且实例化一次。
什么是单利模式?
单例模式就是一个用来划分命名空间并将一批属性和方法组织在一起的对象,,如果他可以被实例化,那么他只能被实例化一次。、。
定义一个对象字面量(结构类似于单例模式)的基本结构如下:
// 对象字面量
var Singleton = {
attr1: 1,
attr2: 2,
method1: function(){
return this.attr1;
},
method2: function(){
return this.attr2;
}
};
上面只是简单的字面量结构,上面的所有成员变量都是通过Singleton来访问的,但是他并不是单例模式,因为单利模式还有一个更重要的特点,就是可以仅被实例化,上面只是不能被实例化的一个类,因为不是单利模式,对象字面量是用来创建单利模式的一种方法;
单利模式如果要被实例化的话,那么只实例化一次,要实现一个单利模式的话,我们无非就是使用一个变量来标识该类是否被实例化,如果未被实例化的话,那么我们可以实例化一次,否则的话,直接返回已经实例化的对象
// 单体模式
var Singleton = function(name){
this.name = name;
this.instance = null;
};
Singleton.prototype.getName = function(){
return this.name;
}
// 获取实例对象
function getInstance(name) {
if(!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
}
// 测试单体模式的实例
var a = getInstance("aa");
var b = getInstance("bb");
单利模式是只实例化一次,所以下面的实例是相等的
console.log(a === b)
var Singleton = function (name) {
this.name = name;
}
Singleton.prototype.getName = function(){
return this.name;
}
//获取实例对象
var getInstance = (function(){
var instance = null;
return function(name){
if(!instance){
instance = new Singleton(name);
}
return instance;
}
})();
//测试单例模式的实例
var a = getInstance("aa");
var b = getInstance("bb");
console.log(a === b);
// 创建div
var createWindow = function(){
var div = document.createElement("div");
div.innerHTML = "我是弹窗内容";
div.style.display = 'none';
document.body.appendChild(div);
return div;
};
// 创建iframe
var createIframe = function(){
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
return iframe;
};
// 获取实例的封装代码
var getInstance = function(fn) {
var result;
return function(){
return result || (result = fn.call(this,arguments));
}
};
// 测试创建div
var createSingleDiv = getInstance(createWindow);
document.getElementById("Id").onclick = function(){
var win = createSingleDiv();
win.style.display = "block";
};
// 测试创建iframe
var createSingleIframe = getInstance(createIframe);
document.getElementById("Id").onclick = function(){
var win = createSingleIframe();
win.src = "http://cnblogs.com";
};