单例模式

单例模式的介绍

单例模式:确保一个类只有一个实例对象,并为全局空间提供一个唯一的访问点去访问该对象。

实现思路:用一个变量来标志该类是否被实例化,如果未被实例化的化,就可以实例化一次,否则返回已经被实例化的对象。

优点:解决了分组作用。

缺点:代码冗余,开发效率低。

单例模式的实现

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值