在開始聊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); }