单例模式的介绍
单例模式:确保一个类只有一个实例对象,并为全局空间提供一个唯一的访问点去访问该对象。
实现思路:用一个变量来标志该类是否被实例化,如果未被实例化的化,就可以实例化一次,否则返回已经被实例化的对象。
优点:解决了分组作用。
缺点:代码冗余,开发效率低。
单例模式的实现
1.字面量对象的单例实现
缺陷:1)会造成变量污染;2)代码容易被修改,造成程序错误,扩展性和可维护性不好
var singleton1 = {
name: "Lucky",
getName: function () {
return this.name;
}
}
2.闭包的单例实现
闭包的方式解决了字面量方式的问题
var CreateObj = function (name) {
this.name = name;
}
CreateObj.prototype.getName = function () {
return this.name;
}
var Singleton2 = (function () {
var instance = null;
return function () {
if (!instance) {
instance = new CreateObj("Lucky");
}
return instance;
}
})();
var obj1 = new Singleton2();
var obj2 = new Singleton2();
console.log(obj1 === obj2);
单例模式的应用
应用:线程池、全局缓存、浏览器中的window对象、系统间各种模式的通信协调、唯一的浮窗、地图的位置实时显示的小图标等。
var mask = function(){
var mask = document.createElement("div");
mask.style.display = "none";
document.body.appendChild(mask);
return mask;
}
var Singleton = (function () {
var instance = null;
return function () {
if (!instance) {
instance = new mask("Lucky");
}
return instance;
}
})();
document.getElementById("btn").onclick = function(){
var mask = Singleton();
mask.style.block = "block";
var popup = createPopup();
popup.style.block = "block";
}
单例模式的封装
以上代码并没有做到单一职责
var mask = function(){
var mask = document.createElement("div");
mask.style.display = "none";
document.body.appendChild(mask);
return mask;
}
var popup = function(){
var popup = document.createElement("div");
popup.style.display = "none";
document.body.appendChild(popup);
return popup;
}
var singleton = function(fn){
var instance = null;
return function(){
return instance || (instance = fn.call(this,arguments));
}
}
var createMask = singleton(mask);
var createPopup = singleton(popup);
document.getElementById("btn").onclick = function(){
var mask = createMask();
var popup = createPopup();
}