簡單工廠模式 --web
簡單工廠模式的思想能夠這樣子理解設計模式
一個商店的售貨員,你跟售貨員買什麼東西,售貨員便拿出你要的東西給你函數
那在代碼裏怎麼構建這個過程呢this
首先,你須要有商品,讓售貨員有物品能夠出售spa
這也就是你的功能需求,這裏須要假設有三個需求,分別是得到一支筆,一張紙,一塊橡皮prototype
那咱們先在代碼裏建立這三個商品類:設計
var pen = function(){ alert("你獲得了一隻筆"); } var paper = function(){ alert("你獲得了一張紙"); } var rubber= function(){ alert("你獲得了一塊橡皮"); }
OK,三個商品類已經建立完成,售貨員倉庫裏就擁有了三件可出售的物品code
那接下來咱們還須要創建一個售貨員Shop,當調用Shop方法時,根據傳入的參數決定拿出什麼商品出來給客人對象
在Shop方法裏定義售貨員和商品間的聯繫,從而讓售貨員有權限出售倉庫裏擁有的物品blog
var Shop = function(goods){ switch(goods){ case "pen": return new pen(); case "paper": return new paper(); case "rubber": return new rubber(); } }
這樣,售貨員創建完,咱們就能夠經過調用售貨員拿到倉庫裏面的各類商品,出售給客人
var pen = Shop("pen"); //你獲得了一隻筆 var paper = Shop("paper"); //你獲得了一張紙 var rubber = Shop("rubber"); //你獲得了一塊橡皮
簡單工廠模式比較適合在一些需求明確的狀況下使用
可當遇到一些需求不明確的狀況,後續有源源不斷的功能要求,那咱們又改怎麼加商品進去倉庫呢?
例如:售貨員的商店每隔幾天就會有新的商品進來,每增長一件商品,咱們就得再寫一個商品類,還有得在售貨員這邊增長錄入售貨員與商品類的聯繫,
這樣兩頭改一方面麻煩,一方面會加大bug出現的概率
另外一種工廠模式的實現--
首先一樣建立一個售貨員+倉庫類
var Shop = function(goods){ if(this instanceof shop){ //防止使用shop的時候將shop直接當成函數使用 return new this[goods](); }else{ return new shop(goods); } }
接下來則建立商品類,放在類原型中,原型即倉庫
Shop.prototype={ pen:function(){ alert("你獲得了一隻筆"); }, paper:function(){ alert("你獲得了一張紙"); }, rubber:function(){ alert("你獲得了一塊橡皮"); } }
獲取商品
var pen = new Shop('pen'); //你獲得了一隻筆 var paper = new Shop('paper'); //你獲得了一隻筆 var rubber = new Shop('rubber'); //你獲得了一隻筆 var pens = Shop('pen'); //你獲得了一隻筆 var papers = Shop('paper'); //你獲得了一隻筆 var rubbers = Shop('rubber'); //你獲得了一隻筆
使用該工廠模式,即便後面需求再修改,不斷有新的需求過來,只須要將商品扔進倉庫,售貨員便知道且能夠出售
忽然有一天,售貨員以爲得給本身的商品都打上本身店的標誌,這樣別人看到了就知道東西是從自家店裏買的
因而他便給每個商品都貼上了屬於本身店的標籤
這樣每個商品都有一個共同的屬性,都是從售貨員店裏出來的
使用前兩種模式,都要在每一個商品里加上一個一樣的屬性,這樣不利於代碼的重複利用,因而便有了下面這種模式
共有屬性--工廠模式
創建一個商店類
function Shop(goods){ var obj = new Object(); //空對象 obj.source = "售貨員店"; switch(goods){ case 'pen': alert("你獲得了一隻筆,來自售貨員店"); break; case 'paper': alert("你獲得了一張紙,來自售貨員店"); break; case 'rubber': alert("你獲得了一塊橡皮,來自售貨員店"); break; } return obj; }
獲取商品
var pen = Shop("pen"); //你獲得了一隻筆,來自售貨員店 var paper = Shop("paper"); //你獲得了一張紙,來自售貨員店 var rubber = Shop("rubber"); //你獲得了一塊橡皮,來自售貨員店
這種模式下,全部經過Shop方法獲得的實例都擁有source這個屬性
實現簡潔代碼,不過這種模式的缺點是沒辦法判斷事例是否屬於某個類
設計模式應用應按需選擇,沒有一成不變的模式
不對之處請指正
我的原創,轉載請註明來源
博客:http://www.cnblogs.com/alex-web/
注:小瘋紙的yy