单例模式i

单例模式:保证一个类仅有一个实例,并且提供一个全局访问

使用场景:比如点击按钮出现弹框,这个弹框是唯一的,无论点击多少次,这个弹框只会被创建一次。

实现方式:用一个变量来标志当前时候已经为某个类创建过对象,如果是,则在下一次获取该类的实例的时候直接返回之前创建的对象。

var SingleClass=function(name){
    this.name=name;
    //标志当前是否已经创建过对象
    this.instance=null;
}

SingleClass.getInstance=function(name){
   if (!this.instance) {
       return this.instance=new SingleClass(name);
   }else{
        return this.instance;
   }
}

也可以写成

var SingleClass = function(name) {
    this.name = name;
}


SingleClass.getInstance = (function() {
        var instance = null;
        return function(name) {
            if (!instance) {
                return instance = new SingleClass(name);
            } else {
                return instance;
            }
        }
})();

透明化单例模式

var CreateDiv = (function() {
    var instance = null;
    var CreateDiv = function(html) {
        if (!instance) {
            this.html = html;
            this.init();
            instance = this; //this是实例化的这个对象
        } else {
            return instance;
        }
    }
    CreateDiv.prototype.init = function() {
        var div = document.createElement('div');
        div.innerHTML = this.html;
        document.body.appendChild(div);
    }

    return CreateDiv;
})();
var a = new CreateDiv('a');
var b = new CreateDiv('b');
alert(a===b)  //true

代理类:把负责管理单例的逻辑移到了来李磊,这样CreateDiv就是普通的类

//代理类
var CreateDiv = function(html) {
    this.html = html;
    this.init();
};
CreateDiv.prototype.init = function() {
    var div = document.createElement('div');
    div.innerHTML = this.html;
    document.body.appendChild(div);
}
var ProxicySingleCreateDiv = (function() {
    var instance = null;
    return function(html) {

        if (!instance) {
            instance = new CreateDiv(html);

        }
        return instance;
    }
})();

var a = new ProxicySingleCreateDiv('a');
var b = new ProxicySingleCreateDiv('b');

传统的单例模式使用了类,但是JavaScript不需要。

惰性单例:在需要的时候才创建对象的实例,就像之前的调用SingleClass.getInstance的时候才被创建

SingleClass.getInstance = (function() {
    var instance = null;
    return function(name) {
        if (!instance) {
            return instance = new SingleClass(name);
        } else {
            return instance;
        }
    }
})();

不过这是基于类的单例模式,在JavaScript中不适用

 

posted @ 2017-04-27 10:21  T1amo  阅读(163)  评论(0编辑  收藏  举报