javascript设计模式-单体singleton模式(2)

本文介绍了JavaScript中的单体模式,包括简单的单体实现、利用闭包保护私有成员的闭包单体、按需加载成员的惰性单体以及根据不同条件创建不同实例的分支单体。

单体(singleton)模式是javascript中最基本但又是最有用的模式之一,它可能比其他任何模式都常用。这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是同样的全局资源

简单单体模式

var Singleton = {
    attr1: true , 
    attr2: 10 ,
    method1 : function(){
        alert('我是方法1');
    },
    method2 : function(){
        alert('我是方法2');
    }
};
alert(Singleton.attr1);

// 补充 :划分命名空间 (区分代码) Ext.Manager.attr1 / method1
var BHX = {};
BHX.Singleton = {
    attr1: true , 
    attr2: 10 ,
    method1 : function(){
        alert('我是方法1');
    },
    method2 : function(){
        alert('我是方法2');
    }               
};
BHX.Singleton.method1();

闭包单体

闭包主要的目地是保护数据,可以添加自己的私有成员,外界无法直接访问,只能通过暴露出去的方法或属性来访问

var BHX = {} ;
BHX.Singleton = (function(){
    // 添加自己的私有成员
    var a1 = true ;
    var a2 = 10 ;
    var f1 = function(){
        alert('f1');
    };
    var f2 = function(){
        alert('f2');
    };          
    // 把块级作用域里的执行结果赋值给单体对象
    return {
            attr1: a1 , 
            attr2: a2 ,
            method1 : function(){
                return f1();
            },
            method2 : function(){
                return f2();
            }                       
    } ;
})();

alert(BHX.Singleton.attr1);
BHX.Singleton.method1();

惰性单体

对于上述闭包这种模式,如果私有的成员变量很多的话,只能被一次性加载,无法做到对其中某些变量只有用到的时候才会去加载。因此惰性单体模式可以有效解决这种问题

var Ext = {};
    Ext.Base = (function() {
        // 私用变量 控制返回的单体对象
        var uniqInstance; // undefined
        // 需要一个构造器 init 初始化单体对象的方法
        function init() {
            // 私用成员变量 
            var a1 = 10;
            var a2 = true;
            var fn1 = function() { alert('fn1') };
            var fn2 = function() { alert('fn2') };
            return {
                attr1: a1,
                arrt2: a2,
                method1: function() {
                    return fn1();
                },
                method2: function() {
                    return fn2();
                }
            };
        }
        return {
            getInstance: function() {
                if (!uniqInstance) { //如果不存在 创建单体实例
                    uniqInstance = init();
                }
                return uniqInstance;
            }
        };
    })();

    alert(Ext.Base.getInstance().attr1);
    Ext.Base.getInstance().method1();

对于这种模式,我们可以有很多个类似uniqInstance的变量来控制之后执行的init方法中需要被加载的变量及方法,只需要分别调用不同的getInstance来做多资源需要被调用的时候才会去加载

分支单体

判断程序的分支 <浏览器差异的检测>

var Ext = {} ;
var def =  false ;
Ext.More = (function(){
    var objA = {        // 火狐浏览器 内部的一些配置
            attr1:'FF属性1'
            // 属性1 
            // 属性2 
            // 方法1 
            // 方法2
    } ;
    var objB = {        // IE浏览器 内部的一些配置
            attr1:'IE属性1'
            // 属性1 
            // 属性2 
            // 方法1 
            // 方法2                          
    } ;
    return (def) ?objA:objB;
})();
alert(Ext.More.attr1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值