js設計模式之工廠模式(一)

簡單工廠模式 --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

相關文章
相關標籤/搜索