zoukankan      html  css  js  c++  java
  • JavaScript设计模式_01_单例模式

    最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言。也看过很多高级教程,觉得自己还是比较热衷于js的设计模式。这一次重温一下《JavaScript设计模式与开发实践》,开篇为单例模式。

    /**
     * pre 单例模式
     * 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
     * 应用:单例模式是一种常用的模式,有一些对象我们往往只需要一个,
     * 比如线程池、全局缓存、浏览器中的 window 对象等。
     */
    //--------------singleton-01-------------
    /*写法1*/
    var Singleton = function(name){
        this.name = name;
        this.instance = null;
    };
    
    Singleton.prototype.getName = function(){
        alert(this.name);
    };
    
    Singleton.getInstance = function(){
        if(!this.instance){
            this.instance = new Singleton(name);
        }
        return this.instance;
    };
    
    var a = Singleton.getInstance("amy");
    var b = Singleton.getInstance("ben");
    alert(a === b);
    
    // ------------singleton-02----------------
    /*写法2*/
    var Singleton = function(name){
        this.name = name;
    }
    Singleton.prototype.getName = function(){
        return this.name;
    }
    
    Singleton.getInstance = (function(){
        var instance = null;
        return function(name){
            if(!instance){
                instance = new Singleton(name);
            }
            return instance;
        }
    })();
    
    var a = Singleton.getInstance("amy");
    var b = Singleton.getInstance("ben");
    alert(a === b);
    
    // ------------singleton03-----------
    /*写法3*/
    var Singleton = (function(){
        var instance;
        return function(name){
            if(instance){
                return instance;
            }
            this.name = name;
            instance = this;
        }
    })();
    var a = new Singleton("amy");
    var b = new Singleton("ben");
    alert(a === b);
    
    //---------------- 示例  ---------------
    var getSingleton = function(fn) {
        var result;
        return function() {
            if(!result) {
                result = fn.apply(this, arguments);
            }
            return result;
        }
    };
    
    var getSingletonVip = (function() {
        var instance;
        return function(fn) {
            return instance || (instance = fn.apply(this, arguments));
        }
    })();
    
    var createLoginUser = function() {
        var div = document.createElement("div");
        div.innerHTML = '这是登录框';
        document.body.appendChild(div);
        return div;
    };
    
    var createInfoGrid = function() {
        var div = document.createElement("div");
        div.innerHTML = '这是列表信息框';
        document.body.appendChild(div);
        return div;
    };
    //--执行getSingleton
    var createUserDiv = getSingleton(createLoginUser);
    createUserDiv();
    createUserDiv();
    
    //--执行getSingletonVip
    getSingletonVip(createLoginUser);
    getSingletonVip(createLoginUser);
  • 相关阅读:
    ionic打包步骤(安卓)
    使用ionic开发时用遇到监听手机返回按钮的问题~
    SQL语句
    SQL小结
    AangularJS的表单验证
    AangularJS过滤器详解
    mysql基础一
    初识rabbitmq
    对数字加千分号实现
    rabbitmq安装
  • 原文地址:https://www.cnblogs.com/stinchan/p/6970592.html
Copyright © 2011-2022 走看看