摘要:簡單工廠模式創(chuàng)建單一的對象示例描述工廠模式主要是為了創(chuàng)建對象實例或者類簇抽象工廠關(guān)心的是最終產(chǎn)出創(chuàng)建的對象而不關(guān)心創(chuàng)建的過程在出現(xiàn)多個類的時候每次創(chuàng)建需要找到對應的類往往比較麻煩這時候通常使用一個函數(shù)進行封裝來創(chuàng)建所需要的對象這樣就無需關(guān)注
簡單工廠模式(創(chuàng)建單一的對象) 示例1 描述
工廠模式主要是為了創(chuàng)建對象實例或者類簇(抽象工廠), 關(guān)心的是最終產(chǎn)出(創(chuàng)建)的對象, 而不關(guān)心創(chuàng)建的過程.
在出現(xiàn)多個類的時候, 每次創(chuàng)建需要找到對應的類往往比較麻煩, 這時候通常使用一個函數(shù)進行封裝來創(chuàng)建所需要的對象,
這樣就無需關(guān)注創(chuàng)建這些對象到底依賴哪些基類了, 只要知道有這個函數(shù)就可以了, 通常這個函數(shù)被稱為工廠函數(shù),
這種模式叫簡單工廠模式
假設一體育商品店賣器材, 里面有很多體育商品, 及其相關(guān)介紹. 當你來到體育用品店買一個籃球及相關(guān)介紹時,
你只需要問售貨員, 她會幫你找到你所需要的東西.
// 籃球基類 var Basketball = function() { this.intro = "籃球盛行于美國"; } Basketball.prototype = function() { getMember: function() { console.log("每個隊伍需要5名隊員"); }, getBallSize: function() { console.log("籃球很大"); } } // 足球基類 var Football = function() { this.intro = "足球在世界范圍內(nèi)盛行"; } Football.prototype = function() { getMember: function() { console.log("每個隊伍需要11名隊員"); }, getBallSize: function() { console.log("足球很大"); } } // 網(wǎng)球基類 var Tennis = function() { this.intro = "每年有很多網(wǎng)球系列賽"; } Tennis.prototype = function() { getMember: function() { console.log("每個隊伍需要1名隊員"); }, getBallSize: function() { console.log("網(wǎ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()); // 每個隊伍需要1名隊員示例2 描述
簡單工廠模式的理念就是創(chuàng)建對象, 而除此之外, 簡單工廠模式還可以創(chuàng)建相似對象. 在創(chuàng)建多個類的時候, 假設每個類都有很多相似的地方, 比如在多種彈出框上都有關(guān)閉按鈕, 都有提示文案等. 可以通過將這些相似的東西提取, 不相似針對性處理即可.
案例假設當前項目需求是需要做各種彈出框: 警示框, 確認框及提示框.實現(xiàn)
var LoginAlert = function(text) { this.content = text; }; LoginAlert.prototype.show = function() { // 顯示警示框 }; var LoginConfirm = function(text) { this.content = text; }; LoginConfirm.prototype.show = function() { // 顯示確認框 }; 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") { // 確認框差異部分 } if(type === "prompt") { // 提示框差異部分 } return o; } // 創(chuàng)建警示框 var userNameAlert = createPop("alert", "用戶名只能是26個字母和數(shù)字");工廠方法模式(創(chuàng)建多類對象) 示例 描述
通過對產(chǎn)品類的抽象使其創(chuàng)建業(yè)務主要負責用于創(chuàng)建多類產(chǎn)品的實例.案例
假設有一批關(guān)于計算機培訓的廣告資源需要投放, 一批是PHP要求黃色字體紅色背景, 一批JAVA綠色字體, 一批JAVASCRIPT粉色背景....實現(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)建學科類工廠 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學科, 紅色邊框..... // 代碼改進: var Factory = function(type, content) { if(this instanceof Factory) { var s = new this[type] (content); return s; } else { return new Factory(type, content); } }; // 在工廠原型中設置創(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)建具體對象, 抽象類中定義的方法只是顯性地定義一些功能, 但沒有具體的實現(xiàn), 而一個對象需要具有一套完整的功能, 所以用抽象類創(chuàng)建的對象也是抽象的而非真實對象. 因此一般用它作為父類來創(chuàng)建子類.
抽象工廠其實是一個實現(xiàn)子類繼承父類的方法, 在這個方法中需要通過傳遞子類以及要繼承父類(抽象類)的名稱,并且在抽象工廠方法中又增加了一次對抽象存在性的一次判斷, 如果存在, 則將子類繼承父類的方法. 然后子類通過寄生式繼承.繼承父類的原型中需要注意一點是, 在對過渡類的原型繼承時, 不是繼承父類的原型, 而是通過new關(guān)鍵字復制父類的一個實例, 這么做事因為過渡類不應僅僅繼承父類的原型方法, 還要繼承父類的對象屬性, 所以要通過new關(guān)鍵字將父類的構(gòu)造函數(shù)執(zhí)行一遍來復制構(gòu)造函數(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 { // 不存在該抽象類拋出錯誤 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)品子類繼承相應的產(chǎn)品簇抽象類 // 寶馬汽車子類 var BMW = function(price, speed) { this.price = price; this.speed = speed; } //抽象工廠實現(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://www.ezyhdfw.cn/yun/80135.html
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設計是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因為所有的具體工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態(tài)工廠方法...
摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調(diào)用它來實現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個工廠創(chuàng)建所有產(chǎn)品(2)工廠方法模式:一個工廠方法創(chuàng)建一個產(chǎn)品(3)抽象工廠模式:一個工廠方法創(chuàng)建一類產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實例的創(chuàng)建和使用分離開來,隱藏類實例的創(chuàng)建細節(jié),外界...
摘要:簡單工廠,工廠模式和抽象工廠。不要認為簡單工廠是用就覺得一無是處,也不要覺得抽象工廠比較高大上就到處套。 工廠模式,實際上也會根據(jù)業(yè)務情景不同會有不同的實現(xiàn)方式。一般分為3種。簡單工廠,工廠模式和抽象工廠。顧名思義,這三種從簡單到抽象,名稱越來越高大上,實現(xiàn)方式肯定是越來越復雜 結(jié)論1:三種工廠的實現(xiàn)越來越復雜 簡單工廠 public class Factory { // 定義...
摘要:我認為按書上的順序比較好理解因為簡單靜態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復雜了,我們一般的應用都寫不到。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 昨天寫了單例模式了,今天是時候?qū)懝S模式啦~ 工廠模式我個人認為其實比...
閱讀 1917·2021-09-22 15:45
閱讀 1725·2019-08-30 15:55
閱讀 1886·2019-08-29 11:16
閱讀 3368·2019-08-26 11:44
閱讀 792·2019-08-23 17:58
閱讀 2747·2019-08-23 12:25
閱讀 1696·2019-08-22 17:15
閱讀 3712·2019-08-22 16:09