• javaScript设计模式(1)——单体模式(单例模式)


    定义:单体模式,也叫单例模式,主要作用是用来划分命名空间,将一批相关的方
    法和属性组织在一起,且只能被实例化一次

    实现方式一:对象字面量

    在下面的对象projects中,存在属于其自己的属性和方法。但这些都是公有的,如
    果其中有this的指代,则可能随着执行环境的上下文的不同而改变存在风险。
    加载(实例化)全部projects,非惰性加载。

    var projects = {
        project_01_name : 'shopping',
        method_01 : function () {
            console.log('hello')
        }
    };
    
    
    console.log(projects.project_01_name);
    projects.method_01();
    

    实现方式二:利用下划线的方式定义私有属性及方法(扩展)

    依然是创建对象的方式,仅仅以是否是下划线来区分私有和公有方法,
    额,并不具有很大的区别与第一个,虽然下划线定义私有成员是一个公认的规则

    var muXiProject = {};/*全局对象,工程性,一级库*/
    
    muXiProject.shopping = {//注意!这是对象的形式
        _name :'muxi_shop',       //private property
        _buy :function(obj) {       //private method
            var money = obj.money;
            console.log(_name+' get ¥'+money)
        },
        buy: function (obj) {       //public method buy()
            return _buy(obj);
        }
    };
    
    
    muXiProject.shopping.buy({
        money:12
    });
    

    实现方式三:利用闭包方式实现私有成员(扩展)

    定义私有的属性及方法,最后返回公有的接口(buy),之后的维护和修改
    ,不用管接口,只用修改内部私有方法即可,不影响外部调用

    var muXiProject = {};/*全局对象,工程性,一级库*/
    
    muXiProject.shopping = (function () {//注意!这是一个自执行函数,返回暴露的方法
        var privateName = 'muxi_shop';
        function privateMethod(obj) {
            var money = obj.money;
            console.log(privateName+' get ¥'+money);
        };
    
        return {      //public method
            buy: function (obj) {
                return privateMethod(obj);
            }
        }
    })();
    
    
    muXiProject.shopping.buy({
        money:11
    });
    

    闭包方式的另外一种实现:工程中可以这样进行工具建设,并对外暴露方法,调用同上

    ;(function () {
        var privateName = 'muxi_shop';
        function privateMethod(obj) {
            var money = obj.money;
            console.log(privateName+' get ¥'+money);
        };
        /*对外暴露buy方法*/
        muXiProject.shopping =  {
            buy: function (obj) {
                return privateMethod(obj);
            }
        }
    })()
    

    实现方式四:闭包实现单体的惰性实例化(升级)

    惰性加载:前面的单体对象都是在脚本加载是后被创建出来,而如果遇到资源密集或
    者开销大的单体的时候,加载可以加一个开关推迟其实例化时间,到用的时候。

    技巧:它最常用于
    那些必须加载大量数据的单体。而那些被作用的命名空间、特定网页专用代码包装器或
    组织相关实用方法的工具的单体最好还是立即实例化。

    转化过程:利用constructor方法将所有原先的单体方法转移进去,之后利用新
    的调用方式调用;

    调用方式:muXiProject.shopping.getIntance().public_method();访问需借助静态方法

    muXiProject.shopping = (function () {
        var instance;
        
        function constructor() {  //这里定义单体的代码
            var privateName = 'muxi_shop';
            function privateMethod(obj) {
                var money = obj.money;
                console.log(privateName+' get ¥'+money);
            };
            return {
                public_buy: function (obj) {
                    return privateMethod(obj);
                }
            }
        };
    
        //返回静态方法,进行实例化判定
        return{
            getIntance :function () {
                if (!instance){
                    instance = constructor();/*实例化*/
                }
                return instance;
            }
        }
    })()
    
    
    muXiProject.shopping.getIntance().public_buy({money:9})
    

    有空还是多读读英文的资料:
    https://github.com/shichuan/javascript-patterns/blob/master/design-patterns/singleton.html
    http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript

  • 相关阅读:
    使用 Traefik 代理 UDP 服务
    KubeOperator界面,集群详情中的存储,存储提供商
    centos7使用yum方式安装node_exporter
    Traefik2.3.x 使用大全(更新版)
    jumpserver堡垒机版本升级,从2.14.2升级到2.16.3
    Traefik 2.0 实现灰度发布
    matplotlib 中文问题
    数据采集实战(五) 当当网童书排名
    雅可比行列式迭代及优化(golang版)
    mysql8.x docker 远程访问配置
  • 原文地址:https://www.cnblogs.com/flora-dn/p/7651757.html
Copyright © 2020-2023  润新知