摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。
JavaScript工廠模式
首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種
簡單工廠模式
工廠方法模式
抽象工廠模式
1.簡單工廠模式簡單工廠模式:又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。
在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。
由工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實(shí)例。
// #簡單工廠模式第一種 /** * 足球類 */ var FootBall = function () { this.play = function () { console.log("我在踢足球"); } } /** * 籃球類 */ var BasketBall = function () { this.play = function () { console.log("我在打籃球"); } } var football = new FootBall(); football.play(); var basketball = new BasketBall(); basketball.play(); /** * 球類工廠 */ var Ball = function(name) { switch (name) { case "足球": return new FootBall(); break; case "籃球": return new BasketBall(); break; } } var football = Ball("足球"); football.play(); var basketball = Ball("籃球"); basketball.play(); // #簡單工廠模式第一種end
這段案例可以簡單的這么去理解,假設(shè)我們需要多個球,我們希望在使用球的時候,只需要告訴管理員我們需要的球的類型,不需要一個個去找對應(yīng)的球這個管理員就相對于工廠函數(shù)。
簡單講就是使用簡單工廠模式,那么你就不需要關(guān)心它的具體實(shí)現(xiàn),你只需要知道你要使用的類型,那么工廠函數(shù)會自動幫你去做對應(yīng)的事情
// #簡單工廠模式第二種 /** * 球類工廠 */ var Ball = function(name) { // 創(chuàng)建一個對象,對對象擴(kuò)展擴(kuò)展屬性還有方法 var o = new Object(); o.name = name; //默認(rèn)的方法 如果在加上一個羽毛球類,這時候就不需要補(bǔ)充play方法 o.play = function () { console.log("我在打"+name); } if (name === "足球") { o.play = function () { console.log("我在踢"+name); } }else if (name === "籃球") { o.play = function () { console.log("我在打"+name); } } // 將對象返回 return o; } var football = Ball("足球"); football.play(); var basketball = Ball("籃球"); basketball.play(); // #簡單工廠模式第二種end
這段案例是用對象的方式代替多個類,把相同點(diǎn)抽離出來,
不同點(diǎn)在一一做類型判斷,這樣也是簡單工廠模式實(shí)現(xiàn)的另一種方式
簡單工廠模式的優(yōu)點(diǎn):
工廠類含有必要的判斷邏輯,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任,而僅僅“消費(fèi)”產(chǎn)品;簡單工廠模式通過這種做法實(shí)現(xiàn)了對責(zé)任的分割,它提供了專門的工廠類用于創(chuàng)建對象
客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可,對于一些復(fù)雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
簡單工廠模式的缺點(diǎn)
由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個系統(tǒng)都要受到影響。
使用簡單工廠模式將會增加系統(tǒng)中類的個數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。
系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時,有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
簡單工廠模式的適用情況
在以下情況下可以使用簡單工廠模式:
工廠類負(fù)責(zé)創(chuàng)建的對象比較少:由于創(chuàng)建的對象較少,不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜。
客戶端只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象不關(guān)心:客戶端既不需要關(guān)心創(chuàng)建細(xì)節(jié),甚至連類名都不需要記住,只需要知道類型所對應(yīng)的參數(shù)。
簡單工廠模式總結(jié)
簡單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入一個正確的參數(shù),就可以獲取你所需要的對象,而無須知道其創(chuàng)建細(xì)節(jié)。
簡單工廠模式最大的優(yōu)點(diǎn)在于實(shí)現(xiàn)對象的創(chuàng)建和對象的使用分離,將對象的創(chuàng)建交給專門的工廠類負(fù)責(zé),但是其最大的缺點(diǎn)在于工廠類不夠靈活,增加新的具體產(chǎn)品需要修改工廠類的判斷邏輯代碼,而且產(chǎn)品較多時,工廠方法代碼將會非常復(fù)雜。
2.工廠方法模式工廠方法模式:又稱為工廠模式,也叫虛擬構(gòu)造器模式或者多態(tài)工廠模式它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個具體產(chǎn)品類這樣解釋可能會有點(diǎn)抽象。
// # 工廠方法模式 // 安全模式創(chuàng)建工廠類 var Ball = function (type,name) { /** * 安全模式 Ball也可以運(yùn)行處new Ball的效果 */ if(this instanceof Ball) { var s = new this[type](name); return s; }else { return new Ball(type,name); } } // 工廠原型中設(shè)置創(chuàng)建所有類型數(shù)據(jù)對象的基類 Ball.prototype = { basketBall: function(name) { this.play = function() { console.log("我在打"+name); } }, footBall: function(name) { this.play = function() { console.log("我在踢"+name); } }, badmintonBall: function(name) { this.play = function() { console.log("我在打"+name); } }, // .... } var football = new Ball("footBall","足球"); football.play(); var basketball = new Ball("basketBall","籃球"); basketball.play(); var badmintonball = new Ball("badmintonBall","羽毛球"); badmintonball.play(); // # 工廠方法模式end
這段案例是這么去理解的,我們先創(chuàng)建一個球類工廠,這個球類工廠是一個抽象的,不做具體的實(shí)現(xiàn),然后我們在這個球類工廠里面在去定義對應(yīng)的球類實(shí)現(xiàn),如籃球,羽毛球,足球等實(shí)現(xiàn),在工廠方法模式中,抽象類工廠只是負(fù)責(zé)定義一個對外的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象。
這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個具體產(chǎn)品類如果這時候在出現(xiàn)一個新的球類運(yùn)動,只需要為這種新類型的球類創(chuàng)建一個具體的球類實(shí)現(xiàn)就可以,這一特點(diǎn)無疑使得工廠方法模式具有超越簡單工廠模式的優(yōu)越性,更加符合“開閉原則”
上面案例包含了一個安全模式的知識點(diǎn)
// 安全模式創(chuàng)建工廠類 var Ball = function (type,name) { /** * 安全模式 Ball也可以運(yùn)行處new Ball的效果 */ if(this instanceof Ball) { var s = new this[type](name); return s; }else { return new Ball(type,name); } }
這段代碼主要解決的問題是,有些同學(xué)使用工廠類的時候,忘記使用關(guān)鍵字new,得不到預(yù)期想要的效果這邊的解決方案就是,在構(gòu)造函數(shù)開始時先判斷當(dāng)前對象this指代是不是當(dāng)前工廠類,如果不是則通過new關(guān)鍵字創(chuàng)建對象返回,這樣就可以實(shí)現(xiàn)不使用new關(guān)鍵詞也可以達(dá)到相同的效果了
工廠方法模式的優(yōu)點(diǎn):
在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。
基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對象,而如何創(chuàng)建這個對象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。
使用工廠方法模式的另一個優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時,無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”。
工廠方法模式的缺點(diǎn):
在添加新產(chǎn)品時,需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會給系統(tǒng)帶來一些額外的開銷。
由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度
工廠方法模式的適用情況
在以下情況下可以使用工廠方法模式:
一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對應(yīng)的工廠即可,具體的產(chǎn)品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類。
一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。
將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。
工廠方法模式總結(jié)
工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠方法模式的主要優(yōu)點(diǎn)是增加新的產(chǎn)品類時無須修改現(xiàn)有系統(tǒng),并封裝了產(chǎn)品對象的創(chuàng)建細(xì)節(jié),系統(tǒng)具有良好的靈活性和可擴(kuò)展性;其缺點(diǎn)在于增加新產(chǎn)品的同時需要增加新的工廠,導(dǎo)致系統(tǒng)類的個數(shù)成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜性。
抽象工廠模式:通過對類的工廠抽象使其業(yè)務(wù)用于對產(chǎn)品類簇的創(chuàng)建,而不是負(fù)責(zé)創(chuàng)建某一類產(chǎn)品的實(shí)例,屬于對象創(chuàng)建型模式。
抽象類一直出現(xiàn)在我們的文章中,那么這邊先來解釋一下什么是抽象類
抽象類是一種聲明但不能使用的類,當(dāng)你使用時就會報錯,在JavaScript中abstract還是一個保留字,所以目前來說還不能像
傳統(tǒng)面向?qū)ο笳Z言那么輕松的去創(chuàng)建抽象類.
不過JavaScript有自己的實(shí)現(xiàn)方式,可以模擬出抽象類
來一段代碼
// 抽象類的介紹 var Ball = function () {} Ball.prototype = { play: function () { return new Error("抽象方法不能調(diào)用"); } }
解釋:
我們可以看到創(chuàng)建的Ball類其實(shí)什么都不能做,創(chuàng)建時沒有任何屬性,原型定義的方法也不能使用,否則就會報錯。但是在繼承上卻是很有用的,
因?yàn)槎x了一種類,并定義了該類所具備的方法,如果沒有在子類中重寫這寫方法,那么調(diào)用的時候就會報錯。
這一特點(diǎn)可以很好的提醒子類去重寫這一方法,不然會在調(diào)用的時候提示錯誤那么在了解了什么是抽象類的情況下,我們在來比較一下工廠方法模式與抽象工廠模式的不同點(diǎn),以方便我們更好的去理解抽象工廠模式
工廠方法模式與抽象工廠模式的對比
在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品,每一個具體工廠對應(yīng)一種具體產(chǎn)品,工廠方法也具有唯一性,一般情況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法。但是有時候我們需要一個工廠可以提供多個產(chǎn)品對象,而不是單一的產(chǎn)品對象。
為了更清晰地理解抽象工廠模式,需要先引入兩個概念:
產(chǎn)品等級結(jié)構(gòu) :產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個抽象類是電視機(jī),其子類有海爾電視機(jī)、海信電視機(jī)、TCL電視機(jī),則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象電視機(jī)是父類,而具體品牌的電視機(jī)是其子類。
產(chǎn)品族 :在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的
海爾電視機(jī)、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級結(jié)構(gòu)中,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中。
抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu),一個工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建。當(dāng)一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象時,抽象工廠模式比工廠方法模式更為簡單、有效率。
這句話比較簡單的理解方式就是:如果一個工廠只需要生產(chǎn)一個類型的產(chǎn)品比如說電視機(jī),那么用工廠方法模式是比較合理的,如果這個工廠又需要成產(chǎn)電視機(jī),又需要生產(chǎn)冰箱之類的,那么這時候用工廠抽象模式就是最合適的。
// # 抽象工廠模式 var Sport = function(subType, superType) { if( typeof Sport[superType] === "function"){ // 緩存類 function F() {}; // 繼承父類屬性和方法 F.prototype = new Sport[superType](); // 將子類constructor 指向子類 subType.constructor = subType; // 子類原型繼承 “父類” subType.prototype = new F(); }else { // 不存在抽象類則拋出錯誤 throw new Error("未創(chuàng)建該抽象類"); } } // 球類運(yùn)動抽象類 Sport.Ball = function () { this.type = "ball"; } Sport.Ball.prototype = { play: function () { return new Error("抽象方法不能調(diào)用"); } } // 力量型運(yùn)動抽象類 Sport.Power = function () { this.type = "power"; } Sport.Power.prototype = { play: function () { return new Error("抽象方法不能調(diào)用"); } } // 速度型運(yùn)動抽象類 Sport.Speed = function () { this.type = "speed"; } Sport.Speed.prototype = { play: function () { return new Error("抽象方法不能調(diào)用"); } } // 籃球類 var BasketBall = function (name) { this.name = name; }; // 抽象工廠實(shí)現(xiàn)對球類運(yùn)動的繼承 Sport(BasketBall,"Ball"); BasketBall.prototype.play = function () { console.log("我在玩"+this.name); } // 舉重類 var WeightLifting = function (name) { this.name = name; }; // 抽象工廠實(shí)現(xiàn)對力量型運(yùn)動的繼承 Sport(WeightLifting,"Power"); WeightLifting.prototype.play = function () { console.log("我在玩"+this.name); } // 跑步類 var Running = function (name) { this.name = name; }; // 抽象工廠實(shí)現(xiàn)對速度運(yùn)動的繼承 Sport(Running,"Speed"); Running.prototype.play = function () { console.log("我在"+this.name); } // 抽象工廠模式實(shí)現(xiàn) var basketBall = new BasketBall("籃球"); console.log(basketBall.type);//ball basketBall.play(); var weightLifting = new WeightLifting("舉重"); console.log(weightLifting.type);//power weightLifting.play(); var running = new Running("跑步"); console.log(running.type);//ball running.play(); /** 輸出結(jié)果 * ball * 我在玩籃球 * power * 我在玩舉重 * speed * 我在跑步 */ // # 抽象工廠模式end
這段栗子先是創(chuàng)建一個運(yùn)動類的抽象工廠,通過這個暴露外部調(diào)用的接口,傳遞2個參數(shù),一個是subType,當(dāng)前實(shí)例化的對象,也就是子類,
一個是superType,需要繼承的父類(抽象類)的名稱,在工廠函數(shù)中實(shí)現(xiàn)了子類對父類的繼承。
在繼承過程中有一個地方需要注意,就是在對過渡類繼承的時候,我們不是繼承父類原型,而是通過new關(guān)鍵字復(fù)制父類的一個實(shí)列,這樣做的目的是過渡類不僅僅繼承父類的原型方法,還需要繼承父類的對象屬性,所以通過new關(guān)鍵字的方式實(shí)現(xiàn)了繼承。
然后通過在抽象工廠類上面進(jìn)行擴(kuò)展對應(yīng)的抽象類,也就是我們需要通過繼承的父類,我這邊添加了3個抽象類Ball,Power,Speed,分別給抽象類指定了type屬性,還有方法play,既然創(chuàng)建了抽象類,那么下面就是開始使用抽象工廠去創(chuàng)建子類,這邊分別對Ball,Power,Speed 3個抽象類進(jìn)行了實(shí)現(xiàn)創(chuàng)建了BasketBall(球類),WeightLifting(力量),Running(速度)3個子類3個子類分別對play方法進(jìn)行了實(shí)現(xiàn)最后就是對于子類的調(diào)用實(shí)現(xiàn),在實(shí)現(xiàn)子類調(diào)用的時候,
我們可以獲取到繼承的父類當(dāng)中對應(yīng)的type
抽象工廠模式的優(yōu)點(diǎn):
當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象。
增加新的具體工廠和產(chǎn)品族很方便,無須修改已有系統(tǒng),符合“開閉原則”。
抽象工廠模式的缺點(diǎn):
開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級結(jié)構(gòu)麻煩)。
增加新的產(chǎn)品等級結(jié)構(gòu):對于增加新的產(chǎn)品等級結(jié)構(gòu),需要修改所有的工廠角色,包括抽象工廠類,在所有的工廠類中都需要增加生產(chǎn)新產(chǎn)品的方法,不能很好地支持“開閉原則”。
抽象工廠模式的適用情況:
在以下情況下可以使用抽象工廠模式:
一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對于所有類型的工廠模式都是重要的。
系統(tǒng)中有多于一個的產(chǎn)品族,而每次只使用其中某一產(chǎn)品族。屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來。
系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)。
抽象工廠模式總結(jié)
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)。
抽象工廠模式適用情況包括:一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié);系統(tǒng)中有多于一個的產(chǎn)品族,而每次只使用其中某一產(chǎn)品族;屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用;系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)。
4.三大工廠模式的關(guān)聯(lián)性當(dāng)抽象工廠模式中每一個具體工廠類只創(chuàng)建一個產(chǎn)品對象,也就是只存在一個產(chǎn)品等級結(jié)構(gòu)時,抽象工廠模式轉(zhuǎn)換成工廠方法模式;
當(dāng)工廠方法模式中抽象工廠與具體工廠合并,提供一個統(tǒng)一的工廠來創(chuàng)建產(chǎn)品對象,并將創(chuàng)建對象的工廠方法設(shè)計為靜態(tài)方法時,工廠方法模式退化成簡單工廠模式。
注:根據(jù)實(shí)際適用情況去選擇對應(yīng)的工廠模式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90572.html
摘要:設(shè)計模式工廠模式最近閱讀了幾本設(shè)計模式方面的書籍學(xué)習(xí)之余整理下來方便以后的歸納和梳理設(shè)計模式工廠模式創(chuàng)造工廠模式是一種創(chuàng)建性模式也就是一種創(chuàng)建對象的最佳實(shí)踐首先我們需要理解為什么我們需要工廠模式想象一個場景如果你要求去買一些東西板燒雞腿 Javascript設(shè)計模式-工廠模式 最近閱讀了幾本設(shè)計模式方面的書籍,學(xué)習(xí)之余整理下來,方便以后的歸納和梳理 設(shè)計模式-工廠模式 創(chuàng)造工廠模式是一...
摘要:從設(shè)計模式的分類來看簡單工廠模式是創(chuàng)建型模式。使用簡單工廠模式將會增加系統(tǒng)中類的個數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。簡單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無法形成基于繼承的等級結(jié)構(gòu)。 簡單工廠模式提供了一個接口可以根據(jù)傳遞的參數(shù)的不同創(chuàng)建不同的對象,從而將對象自身的邏輯與對象的創(chuàng)建分離開。 從設(shè)計模式的分類來看簡單工廠模式是創(chuàng)建型模式。事實(shí)上與簡單工廠模式類似的還...
摘要:工廠方法模式,通過對產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。安全模式類安全模式類可以屏蔽使用類的錯誤造成的錯誤??梢詫⒐S方法看作是一個實(shí)例化對象的工廠類,安全起見,采用安全模式類,將創(chuàng)建對象的基類放在工廠方法類的原型中即可。 工廠方法模式,通過對產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。前面記錄了簡單工廠模式,但是需求時不斷變化的,當(dāng)需求簡單時,直接創(chuàng)建對象...
摘要:設(shè)計模式共有種,我今天先來了解一下工廠模式,其他的模式將會在后續(xù)的博客中陸續(xù)為大家講解。工廠模式主要分為簡單工廠模式和抽象工廠模式。抽象工廠模式抽象工廠模式與簡單工廠函數(shù)不同的是,抽象工廠函數(shù)會先設(shè)計好接口,具體的實(shí)現(xiàn)在子類中進(jìn)行。 設(shè)計模式 設(shè)計模式(design pattern)概念:是一套反復(fù)使用、思想成熟、經(jīng)過分類和無數(shù)實(shí)戰(zhàn)設(shè)計經(jīng)驗(yàn)的總結(jié)。是為了代碼可重用、可擴(kuò)展、可解耦、更容...
摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對象經(jīng)歷了以下四個過程創(chuàng)建一個新對象構(gòu)造函數(shù)的作用域交給新對象。 ??在創(chuàng)建對象的時候,使用對象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個對象是最簡單最方便的方式。但是凡是處于初級階段的事物都會不可避免的存在一個問題,沒有普適性,意思就是說我要為世界上(程序中)的所有使用到的對象都使用一遍 var xxx = {} ,...
摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對象經(jīng)歷了以下四個過程創(chuàng)建一個新對象構(gòu)造函數(shù)的作用域交給新對象。 ??在創(chuàng)建對象的時候,使用對象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個對象是最簡單最方便的方式。但是凡是處于初級階段的事物都會不可避免的存在一個問題,沒有普適性,意思就是說我要為世界上(程序中)的所有使用到的對象都使用一遍 var xxx = {} ,...
閱讀 3504·2021-09-22 15:02
閱讀 3585·2021-09-02 15:21
閱讀 2162·2019-08-30 15:55
閱讀 2817·2019-08-30 15:44
閱讀 808·2019-08-29 16:56
閱讀 2448·2019-08-23 18:22
閱讀 3371·2019-08-23 12:20
閱讀 3115·2019-08-23 11:28