javascript设计模式6

单体模式:用来划分命名空间而组织一些方法和属性的对象,如果它能被实例化,只能被实例化一次;但对象不是单体

var Singleton={
    attr1:true;
    attr2:2,
    method1:function(){
        ...
    },
    method2:function(){
        ...
    }
};
var GiantCorp={};
GiantCorp.Common={
    ...
};
GiantCorp.ErrorCodes={
    ...
};
GiantCorp.PageHandler={
    ...
};

单体模式中使用闭包(又称为模块模式)

MyNamespace.Singleton=(function(){
    var privateAttribute1=false;
    var privateAttribute2=[1,2,3];
    function privateMethod1(){
        ...
    };
    function privateMethod2(args){
        ...
    };
    return{
        publicAttribute1=true,
        publicAttribute2=10,
        publicMethod1=function(){
            ...
        },
        publicMethod2=function(){
            ...
        }
    };
})();

 惰性实例化(将实例化推迟到需要的时候)

MyNamespace.Singleton=(function(){
    function constructor(){//放到闭包中
        var privateAttribute1=false;
        var privateAttribute2=[1,2,3];
        function privateMethod1(){
            ...
        };
        function privateMethod2(args){
            ...
        };
        return{
            publicAttribute1=true,
            publicAttribute2=10,
            publicMethod1=function(){
                ...
            },
            publicMethod2=function(){
                ...
            }
        }
    };
    return{//公共方法
        getInstance:function(){
            ...
        }
    }
})();

加上一个开关(若未实例则实例一次,已经实例就返回这个实例)

Mynamespace.Singleton=(function(){
    var uniqueInstance;
    function constructor(){
        ...
    };
    return{
        getInstance:function(){
            if(!uniqueInstance){
                uniqueInstance=constructor();
            }
            return uniqueInstance;
        }
    }
})();
//Mynamespace.Singleton.getInstance.publicMethod1();

 分支(创建多个对象字面量,根据某种条件赋给那个变量)

MyNamespace.Singleton=(function(){
    var objectA={
        method1:function(){
            ...
        },
        method2:function(){
            ...
        }
    };
    var objectB={
        method1:function(){
            ...
        },
        method2:function(){
            ...
        }
    };
    return (someCondition)?objectA:objectB;
})();

 

posted @ 2015-01-13 21:52  庄昌宽  阅读(112)  评论(0编辑  收藏  举报