摘要:簡單工廠模式創(chuàng)建單一的對象示例描述工廠模式主要是為了創(chuàng)建對象實(shí)例或者類簇抽象工廠關(guān)心的是最終產(chǎn)出創(chuàng)建的對象而不關(guān)心創(chuàng)建的過程在出現(xiàn)多個(gè)類的時(shí)候每次創(chuàng)建需要找到對應(yīng)的類往往比較麻煩這時(shí)候通常使用一個(gè)函數(shù)進(jìn)行封裝來創(chuàng)建所需要的對象這樣就無需關(guān)注
簡單工廠模式(創(chuàng)建單一的對象) 示例1 描述
工廠模式主要是為了創(chuàng)建對象實(shí)例或者類簇(抽象工廠), 關(guān)心的是最終產(chǎn)出(創(chuàng)建)的對象, 而不關(guān)心創(chuàng)建的過程.
在出現(xiàn)多個(gè)類的時(shí)候, 每次創(chuàng)建需要找到對應(yīng)的類往往比較麻煩, 這時(shí)候通常使用一個(gè)函數(shù)進(jìn)行封裝來創(chuàng)建所需要的對象,
這樣就無需關(guān)注創(chuàng)建這些對象到底依賴哪些基類了, 只要知道有這個(gè)函數(shù)就可以了, 通常這個(gè)函數(shù)被稱為工廠函數(shù),
這種模式叫簡單工廠模式
假設(shè)一體育商品店賣器材, 里面有很多體育商品, 及其相關(guān)介紹. 當(dāng)你來到體育用品店買一個(gè)籃球及相關(guān)介紹時(shí),
你只需要問售貨員, 她會幫你找到你所需要的東西.
// 籃球基類 var Basketball = function() { this.intro = "籃球盛行于美國"; } Basketball.prototype = function() { getMember: function() { console.log("每個(gè)隊(duì)伍需要5名隊(duì)員"); }, getBallSize: function() { console.log("籃球很大"); } } // 足球基類 var Football = function() { this.intro = "足球在世界范圍內(nèi)盛行"; } Football.prototype = function() { getMember: function() { console.log("每個(gè)隊(duì)伍需要11名隊(duì)員"); }, getBallSize: function() { console.log("足球很大"); } } // 網(wǎng)球基類 var Tennis = function() { this.intro = "每年有很多網(wǎng)球系列賽"; } Tennis.prototype = function() { getMember: function() { console.log("每個(gè)隊(duì)伍需要1名隊(duì)員"); }, getBallSize: function() { console.log("網(wǎng)球很小"); } } // 運(yùn)動(dòng)工廠(這邊相當(dāng)于咨詢體育器材店的售貨員, 告訴她你想要買什么體育用品) var SportFactory = function(name) { switch(name) { case "basketball": return new Basketball(); case "football": return new Football(); case "tennis": return new Tennis(); } } var ball = new SportFactory("tennis"); console.log(ball.intro) // 每年有很多網(wǎng)球系列賽 console.log(ball.getMember()); // 每個(gè)隊(duì)伍需要1名隊(duì)員示例2 描述
簡單工廠模式的理念就是創(chuàng)建對象, 而除此之外, 簡單工廠模式還可以創(chuàng)建相似對象. 在創(chuàng)建多個(gè)類的時(shí)候, 假設(shè)每個(gè)類都有很多相似的地方, 比如在多種彈出框上都有關(guān)閉按鈕, 都有提示文案等. 可以通過將這些相似的東西提取, 不相似針對性處理即可.
案例假設(shè)當(dāng)前項(xiàng)目需求是需要做各種彈出框: 警示框, 確認(rèn)框及提示框.實(shí)現(xiàn)
var LoginAlert = function(text) { this.content = text; }; LoginAlert.prototype.show = function() { // 顯示警示框 }; var LoginConfirm = function(text) { this.content = text; }; LoginConfirm.prototype.show = function() { // 顯示確認(rèn)框 }; var LoginPrompt = function(text) { this.content = text; }; LoginPrompt.prototype.show = function() { // 顯示提示框 }; function createPop(type, text) { var o = new Object(); o.content = text; o.show = function() { // 顯示方法 }; if(type === "alert") { // 警示框差異部分 } if(type === "confirm") { // 確認(rèn)框差異部分 } if(type === "prompt") { // 提示框差異部分 } return o; } // 創(chuàng)建警示框 var userNameAlert = createPop("alert", "用戶名只能是26個(gè)字母和數(shù)字");工廠方法模式(創(chuàng)建多類對象) 示例 描述
通過對產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù)主要負(fù)責(zé)用于創(chuàng)建多類產(chǎn)品的實(shí)例.案例
假設(shè)有一批關(guān)于計(jì)算機(jī)培訓(xùn)的廣告資源需要投放, 一批是PHP要求黃色字體紅色背景, 一批JAVA綠色字體, 一批JAVASCRIPT粉色背景....實(shí)現(xiàn)
var Java = function(content) { this.content = content; (functiont(content) { var div = document.createElement("div"); div.innerHTML = content; div.style.color = "green"; document.getElementById("container").appendChild(div); })(content); }; var Php = function(content) { this.content = content; (functiont(content) { var div = document.createElement("div"); div.innerHTML = content; div.style.color = "yellow"; div.style.background = "red"; document.getElementById("container").appendChild(div); })(content); }; var Javascript = function(content) { this.content = content; (functiont(content) { var div = document.createElement("div"); div.innerHTML = content; div.style.background = "pink"; document.getElementById("container").appendChild(div); })(content); }; // 創(chuàng)建學(xué)科類工廠 function JobFactory(type, content) { switch(type) { case "java": return new Java(content); case "php": return new Php(content); case "Javascript": return new Javascript(contet); } } // 又要添需求啦.....多加一批UI學(xué)科, 紅色邊框..... // 代碼改進(jìn): var Factory = function(type, content) { if(this instanceof Factory) { var s = new this[type] (content); return s; } else { return new Factory(type, content); } }; // 在工廠原型中設(shè)置創(chuàng)建所有類型數(shù)據(jù)對象的基類 Factory.prototype = { Java: function() { // ... }, Php: function() { // ... }, Javascript: function() { // ... }, UI: function() { // ... } }; var data = [ {type:"JavaScript", content:"javascript"}, {type:"Java", content:"java"}, {type:"PHP", content:"php"}, {type:"UI", content:"ui"} ]; for(var i = data.length; i >= 0; i--) { Factory(data[i].type, data[i].content); }抽象工廠模式(創(chuàng)建類簇) 示例 描述
抽象工廠模式一般不用來創(chuàng)建具體對象, 抽象類中定義的方法只是顯性地定義一些功能, 但沒有具體的實(shí)現(xiàn), 而一個(gè)對象需要具有一套完整的功能, 所以用抽象類創(chuàng)建的對象也是抽象的而非真實(shí)對象. 因此一般用它作為父類來創(chuàng)建子類.
抽象工廠其實(shí)是一個(gè)實(shí)現(xiàn)子類繼承父類的方法, 在這個(gè)方法中需要通過傳遞子類以及要繼承父類(抽象類)的名稱,并且在抽象工廠方法中又增加了一次對抽象存在性的一次判斷, 如果存在, 則將子類繼承父類的方法. 然后子類通過寄生式繼承.繼承父類的原型中需要注意一點(diǎn)是, 在對過渡類的原型繼承時(shí), 不是繼承父類的原型, 而是通過new關(guān)鍵字復(fù)制父類的一個(gè)實(shí)例, 這么做事因?yàn)檫^渡類不應(yīng)僅僅繼承父類的原型方法, 還要繼承父類的對象屬性, 所以要通過new關(guān)鍵字將父類的構(gòu)造函數(shù)執(zhí)行一遍來復(fù)制構(gòu)造函數(shù)中的屬性和方法
抽象工廠添加抽象類比較特殊, 因?yàn)槌橄蠊S是個(gè)方法不需要實(shí)例化對象, 故只需要一份, 因此直接為抽象工廠添加類的屬性即可.
實(shí)現(xiàn)// 抽象工廠方法 var VehicleFatory = function(subType, superType) { // 判斷抽象工廠中是否有該抽象類 if(typeof VehicleFactory[superType] === "function") { // 緩存類 function F() {}; // 繼承父類屬性和方法 F.prototype = new VehicleFactory[superType] (); // 將子類constructor 指向子類 subType.constructor = subType; // 子類原型繼承"父類" subType.prototype = new F(); } else { // 不存在該抽象類拋出錯(cuò)誤 throw new Error("未創(chuàng)建該抽象類"); } }; // 小汽車抽象類 VehicleFactory.Car = function() { this.type = "car"; }; VehicleFactory.Car.prototype = { getPrice: function() { return new Error("抽象方法不能調(diào)用"); }, getSpeed: function() { return new Error("抽象方法不能調(diào)用"); } }; // 公交車抽象類 VehicleFactory.Bus = function() { this.type = "bus"; }; VehicleFactory.Bus.prototype = { getPrice: function() { return new Error("抽象方法不能調(diào)用"); }, getSpeed: function() { return new Error("抽象方法不能調(diào)用"); } }; // 貨車抽象類 VehicleFactory.Truck = function() { this.type = "truck"; }; VehicleFactory.Truck.prototype = { getPrice: function() { return new Error("抽象方法不能調(diào)用"); }, getSpeed: function() { return new Error("抽象方法不能調(diào)用"); } }; // 創(chuàng)建產(chǎn)品子類繼承相應(yīng)的產(chǎn)品簇抽象類 // 寶馬汽車子類 var BMW = function(price, speed) { this.price = price; this.speed = speed; } //抽象工廠實(shí)現(xiàn)對Car抽象類的繼承 VehicleFactory(BMW, "Car"); BMW.prototype.getPrice = function() { return this.price }; BMW.prototype.getSpeed = function() { return this.speed }; // 公交車... // 貨車...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80135.html
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態(tài)工廠方法...
摘要:不過怎么來說工廠方法模式是簡單工廠模式的升級版。其次,工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現(xiàn)的尤為明顯。 工廠模式想必大家在開發(fā)過程中會經(jīng)常用到,顧名思義其就是作為一個(gè)工廠用來生產(chǎn)產(chǎn)品的,下面來簡單介紹幾種常見的工廠模式。 0x01 簡單工廠模式 1、類圖結(jié)構(gòu)showImg(/img/bVFf1t?w=531&h=278); 2、角色分類 工廠類:其內(nèi)部具有一點(diǎn)的判...
摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調(diào)用它來實(shí)現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個(gè)工廠創(chuàng)建所有產(chǎn)品(2)工廠方法模式:一個(gè)工廠方法創(chuàng)建一個(gè)產(chǎn)品(3)抽象工廠模式:一個(gè)工廠方法創(chuàng)建一類產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實(shí)例的創(chuàng)建和使用分離開來,隱藏類實(shí)例的創(chuàng)建細(xì)節(jié),外界...
摘要:簡單工廠,工廠模式和抽象工廠。不要認(rèn)為簡單工廠是用就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。 工廠模式,實(shí)際上也會根據(jù)業(yè)務(wù)情景不同會有不同的實(shí)現(xiàn)方式。一般分為3種。簡單工廠,工廠模式和抽象工廠。顧名思義,這三種從簡單到抽象,名稱越來越高大上,實(shí)現(xiàn)方式肯定是越來越復(fù)雜 結(jié)論1:三種工廠的實(shí)現(xiàn)越來越復(fù)雜 簡單工廠 public class Factory { // 定義...
摘要:我認(rèn)為按書上的順序比較好理解因?yàn)楹唵戊o態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強(qiáng)。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復(fù)雜了,我們一般的應(yīng)用都寫不到。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 昨天寫了單例模式了,今天是時(shí)候?qū)懝S模式啦~ 工廠模式我個(gè)人認(rèn)為其實(shí)比...
摘要:工廠方法模式工廠方法模式是為了克服簡單工廠模式的缺點(diǎn)。抽象工廠模式抽象工廠模式主要在于應(yīng)對新系列的需求變化。此時(shí)架構(gòu)便可以升級為工廠方法模式。 在面向?qū)ο缶幊讨袆?chuàng)建一個(gè)對象通常通過new關(guān)鍵字來創(chuàng)建,但是往往在一些業(yè)務(wù)場景下,個(gè)別對象是一個(gè)比較復(fù)雜的bean。此時(shí)創(chuàng)建對象不光是new了,還需要一些額外的操作,比如填充數(shù)據(jù),附屬對象的準(zhǔn)備等等。如果我們想要得到這樣的一個(gè)對象,直接簡單粗暴...
閱讀 1889·2021-09-22 15:45
閱讀 1674·2019-08-30 15:55
閱讀 1856·2019-08-29 11:16
閱讀 3329·2019-08-26 11:44
閱讀 739·2019-08-23 17:58
閱讀 2719·2019-08-23 12:25
閱讀 1654·2019-08-22 17:15
閱讀 3643·2019-08-22 16:09