Javascript中的IOC工廠

在開始聊IOC工廠前,先說一個我在洗澡時想到的故事。
ide

話說某一部最新的007的電影要開拍了。導演放話給製片說,007要開拍了。如今須要邦×××一名。要求以下,ui

天使的面孔,魔鬼的身材。this

經紀人A和製片比較熟。就和製片說。我這裏有個妹子,天使的面孔魔鬼的身材。orm

製片說。好了就讓你包裝的妹子上吧。對象

合同簽了。經紀人A就發愁了。還沒妹子給我包裝啊。繼承

這時他的好朋友經紀人B就給他說了。別怕。我這裏有個妹子,天使的面孔,魔鬼的身材。接口

經紀人A一聽就高興了。好兄弟,就你了。get

合同簽了,經紀人B就發愁了。唉。。我哪裏有妹子啊。先騙個合同混口飯吃。it

這時,B看見馬路對面出現一個妹子。哇 天使的面孔 魔鬼的身材。就上去搭訕說。io

妹子,我這裏有個007的電影女一號,你有興趣麼?妹子一聽,立馬答應下來給B進行包裝。

這下你們都開心了。電影如期開拍。

電影拍完了。製片給經紀人A說,這裏是100萬的支票,這段時間辛苦了。

A給B說,這裏是80萬的支票,這段時間辛苦了。

B給妹子說,這裏是60萬的支票,這段時間辛苦了。。

故事到這裏就結束了。下面是故事當中的扮演者名單

導演:對象調用者,

製片:IOC工廠,

邦×××要求:接口,

經紀人A&B:接口包裝類

妹子:接口繼承類


從這個故事能夠看出,對於導演來講,他並不關心也不知道製片給他找了一個什麼人。只要求符合他的接口就能夠了。

而對於妹子來講,由於他的出演是通過2個經紀人進行了包裝的,因此只能拿到60萬的支票。


好了故事分享完了。咱們就開始分享一下核心代碼吧。

var Factory = function () {
    //單例模式
    if (arguments.callee.instance) {
        return arguments.callee.instance;
    }
    arguments.callee.instance = this;
    var dic = {};
    var getInstByRegister = function (reg) {
        if (!reg) throw "require type<" + key + "> not registed";
        switch (reg.InstType) {
            case Enum.InstType.Normal:
                return new reg.type();
                break;
            case Enum.InstType.Singleton:
                return reg.type;
                break;
            case Enum.InstType.Decorate:
                return new reg.type(getInstByRegister(reg.NextReg));
        }
    }
    var getReg = function (interface, key) {
        var interfaceCode = interface.GetHashCode();
        var iDic = getIDic(interface);
        if (key && iDic[key]) {
        } else {
            key = "base";
        }
        var reg = iDic[key];
        return reg;
    }
    var getIDic = function (interface) {
//獲取 類型的惟一值 以進行註冊
        var interfaceCode = interface.GetHashCode();
        if (!dic[interfaceCode]) {
            dic[interfaceCode] = {};
        }
        var iDic = dic[interfaceCode];
        return iDic;
    }
//獲取實例
//param: 接口類 關鍵字
    this.getInst = function (interface, key) {
        if (this.Register != null && this.Register.Check) {
            this.Register.Check();
        }
        var reg = getReg(interface, key);
        return getInstByRegister(reg);
    }
    this.Register = null;
//註冊 裝飾類
//param:接口類 裝飾類 裝飾關鍵字
    this.RegistDecorate = function (interface, type, key) {
        if (!key) { key = "base" };
        try {
            var reg = getReg(interface, key);
            var iDic = getIDic(interface);
            var newReg = { InstType: Enum.InstType.Decorate, type: type, NextReg: reg };
            iDic[key] = newReg;
        } catch (ex) {
            throw "toDecorate inst not regist";
        }
    }
//註冊類
//param:接口類 註冊類 是否單例 關鍵字
    this.Regist = function (interface, type, isSingleton, key) {
        var instType = Enum.InstType.Normal;
        if (isSingleton) {
            instType = Enum.InstType.Singleton;
        }
        var iDic = getIDic(interface);
        if (!key) key = "base";
        if (isSingleton) {
            type = new type();
        }
        iDic[key] = { InstType: instType, type: type };
    }
}
Factory.getInst = function (interface, key) {
    var obj = new Factory();
    return obj.getInst(interface, key);
}
相關文章
相關標籤/搜索