• 单例模式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中不适用

  • 相关阅读:
    普通链表的各种排序及常用操作
    数据结构、算法与应用(C++描述)(第二版)第六章习题解答
    数据结构、算法与应用(C++描述)(第二版)第三章习题解答
    数据结构、算法与应用(C++描述)(第二版)第二章习题解答
    数据结构、算法与应用(C++描述)(第二版)第一章习题解答
    数据结构、算法与应用(C++描述)(第二版)第五章习题解答
    C++排序算法
    Code-C++-Cut CString to get keyValue by ","||"}"
    C++-Struct string初始化&&map初始化
    JSON的简单介绍以及C语言的JSON库使用
  • 原文地址:https://www.cnblogs.com/t1amo/p/6772884.html
Copyright © 2020-2023  润新知