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

posted @ 2017-10-11 17:32  egohere  阅读(264)  评论(0)    收藏  举报