设计模式——工厂模式
簡單工廠模式(創建單一的對象)
示例1
描述
工廠模式主要是為了創建對象實例或者類簇(抽象工廠), 關心的是最終產出(創建)的對象, 而不關心創建的過程.
在出現多個類的時候, 每次創建需要找到對應的類往往比較麻煩, 這時候通常使用一個函數進行封裝來創建所需要的對象,
這樣就無需關注創建這些對象到底依賴哪些基類了, 只要知道有這個函數就可以了, 通常這個函數被稱為工廠函數,
這種模式叫簡單工廠模式
案例
假設一體育商品店賣器材, 里面有很多體育商品, 及其相關介紹. 當你來到體育用品店買一個籃球及相關介紹時,
你只需要問售貨員, 她會幫你找到你所需要的東西.
實現
// 籃球基類 var Basketball = function() {this.intro = '籃球盛行于美國'; } Basketball.prototype = function() {getMember: function() {console.log('每個隊伍需要5名隊員');},getBallSize: function() {console.log('籃球很大');} }// 足球基類 var Football = function() {this.intro = '足球在世界范圍內盛行'; } Football.prototype = function() {getMember: function() {console.log('每個隊伍需要11名隊員');},getBallSize: function() {console.log('足球很大');} }// 網球基類 var Tennis = function() {this.intro = '每年有很多網球系列賽'; } Tennis.prototype = function() {getMember: function() {console.log('每個隊伍需要1名隊員');},getBallSize: function() {console.log('網球很小');} }// 運動工廠(這邊相當于咨詢體育器材店的售貨員, 告訴她你想要買什么體育用品) 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) // 每年有很多網球系列賽 console.log(ball.getMember()); // 每個隊伍需要1名隊員示例2
描述
簡單工廠模式的理念就是創建對象, 而除此之外, 簡單工廠模式還可以創建相似對象. 在創建多個類的時候, 假設每個類都有很多相似的地方, 比如在多種彈出框上都有關閉按鈕, 都有提示文案等. 可以通過將這些相似的東西提取, 不相似針對性處理即可.
案例
假設當前項目需求是需要做各種彈出框: 警示框, 確認框及提示框.實現
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; }// 創建警示框 var userNameAlert = createPop('alert', '用戶名只能是26個字母和數字');工廠方法模式(創建多類對象)
示例
描述
通過對產品類的抽象使其創建業務主要負責用于創建多類產品的實例.案例
假設有一批關于計算機培訓的廣告資源需要投放, 一批是PHP要求黃色字體紅色背景, 一批JAVA綠色字體, 一批JAVASCRIPT粉色背景....實現
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); };// 創建學科類工廠 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);} };// 在工廠原型中設置創建所有類型數據對象的基類 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); }抽象工廠模式(創建類簇)
示例
描述
抽象工廠模式一般不用來創建具體對象, 抽象類中定義的方法只是顯性地定義一些功能, 但沒有具體的實現, 而一個對象需要具有一套完整的功能, 所以用抽象類創建的對象也是抽象的而非真實對象. 因此一般用它作為父類來創建子類.
抽象工廠其實是一個實現子類繼承父類的方法, 在這個方法中需要通過傳遞子類以及要繼承父類(抽象類)的名稱,并且在抽象工廠方法中又增加了一次對抽象存在性的一次判斷, 如果存在, 則將子類繼承父類的方法. 然后子類通過寄生式繼承.繼承父類的原型中需要注意一點是, 在對過渡類的原型繼承時, 不是繼承父類的原型, 而是通過new關鍵字復制父類的一個實例, 這么做事因為過渡類不應僅僅繼承父類的原型方法, 還要繼承父類的對象屬性, 所以要通過new關鍵字將父類的構造函數執行一遍來復制構造函數中的屬性和方法
抽象工廠添加抽象類比較特殊, 因為抽象工廠是個方法不需要實例化對象, 故只需要一份, 因此直接為抽象工廠添加類的屬性即可.
實現
// 抽象工廠方法 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('未創建該抽象類');} };// 小汽車抽象類 VehicleFactory.Car = function() {this.type = 'car'; }; VehicleFactory.Car.prototype = {getPrice: function() { return new Error('抽象方法不能調用'); },getSpeed: function() { return new Error('抽象方法不能調用'); } };// 公交車抽象類 VehicleFactory.Bus = function() {this.type = 'bus'; }; VehicleFactory.Bus.prototype = {getPrice: function() { return new Error('抽象方法不能調用'); },getSpeed: function() { return new Error('抽象方法不能調用'); } };// 貨車抽象類 VehicleFactory.Truck = function() {this.type = 'truck'; }; VehicleFactory.Truck.prototype = {getPrice: function() { return new Error('抽象方法不能調用'); },getSpeed: function() { return new Error('抽象方法不能調用'); } };// 創建產品子類繼承相應的產品簇抽象類 // 寶馬汽車子類 var BMW = function(price, speed) {this.price = price;this.speed = speed; } //抽象工廠實現對Car抽象類的繼承 VehicleFactory(BMW, 'Car'); BMW.prototype.getPrice = function() { return this.price }; BMW.prototype.getSpeed = function() { return this.speed };// 公交車... // 貨車...總結
以上是生活随笔為你收集整理的设计模式——工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 告诉你KVC的一切-b
- 下一篇: BZOJ 3101: N皇后 构造