单例模式

本文深入讲解了单例模式的概念及其实现方式,包括不透明单例、透明单例和惰性单例等不同形式,并提供了JavaScript的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式

单例模式是一种保证一个类仅仅拥有一个实例的模式,使用这种模式,全局仅仅有一个该类的实例,它的实现思路是,构造一个类,这个类拥有instance属性,这个属性是一个flag,当它为null时才能创建一个类的实例,并且把实例赋值给它;创建实例使用的一个静态方法一般命名为getInstance

实现一个不透明度单例模式

不透明单例特点是就是不能通过new Single来创建单例,而是通过
Single.getInstance,意味着我们必须知道构造函数里面的getInstance方法,Single构造函数对我们来说不是透明的

// 方法一: 使用this.instance作flag
var Single = function(name){
    this.name = name;
    this.instance = null;// 用来判断是否已经实例化
}
Single.prototype.getName = function(){
    console.log(this.name);
}
Single.getInstance = function(name){
       if (!this.instance) {
        this.instance = new Single(name);
       }
       return this.instance;
   }
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);

// 方法一:使用闭包把参数当作flag
var Single = function(name){
    this.name = name;
}
Single.prototype.getName = function(){
    console.log(this.name);
}
// 自调用函数返回一个函数,这个函数的调用环境和instace构成了闭包,所以在这个函数内部可以修改instance变量
Single.getInstance = (function(name){
       var instance = null;// 用来判断是否已经实例化
          return function(name){
            if (!instance) instance = new Single(name);
            return instance;
          }
       })();
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);


实现透明的单例

透明单例特点是就是不能通过new Single来创建单例,构造函数里面的内容我们不需要关心,也不用知道,有两种方法来实现单例:

/ 方法一 
// 用代理实现单例模式
var Single = (function(){
    // instance和Single都在闭包里面
    var instance = null;
    function Single(name){
        this.name = name;
      }
    Single.prototype.getName = function(){
      console.log(this.name);
    }
    // 下面这个函数返回出去
    return function(name){
      if (!instance) {
        instance = new Single(name);
      }
      return instance;
    }
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);

//方法二
//把控制单例的条件语句下载构造函数里面
var Single = (function(){
    var instance = null;
    var Single = function(name){
    if (instance) {
        return instance;
    }
    this.name = name;
    instance = this;
}
    Single.prototype.getName = function(){
      console.log(this.name);
    }
    return Single;
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);


javascript中常用惰性单例

在合适的情况才创建对象,并且只创建一个对象
原理:让getSingle返回一个新的函数,并且用变量result来保存fn的计算结果,result本身在闭包中,永远不会被销毁,在将来的请求中,如果result已经被赋值,那么就会将这个数返回;
应用场景举例: 将createXhr传入里面,如果已经调用了createXhr,再将createXhr传入里面,返回的结果仍然是之前调用的结果;

//惰性单例
function getSingle(fn){
   var result;
   return function(){
     return result || (result = fn.apply(this, arguments));
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值