国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript設(shè)計(jì)模式-工廠模式

feng409 / 1845人閱讀

摘要:設(shè)計(jì)模式工廠模式最近閱讀了幾本設(shè)計(jì)模式方面的書籍學(xué)習(xí)之余整理下來(lái)方便以后的歸納和梳理設(shè)計(jì)模式工廠模式創(chuàng)造工廠模式是一種創(chuàng)建性模式也就是一種創(chuàng)建對(duì)象的最佳實(shí)踐首先我們需要理解為什么我們需要工廠模式想象一個(gè)場(chǎng)景如果你要求去買一些東西板燒雞腿

Javascript設(shè)計(jì)模式-工廠模式

最近閱讀了幾本設(shè)計(jì)模式方面的書籍,學(xué)習(xí)之余整理下來(lái),方便以后的歸納和梳理

設(shè)計(jì)模式-工廠模式

創(chuàng)造工廠模式是一種創(chuàng)建性模式,也就是一種創(chuàng)建對(duì)象的最佳實(shí)踐.首先我們需要理解:

為什么我們需要工廠模式?

想象一個(gè)場(chǎng)景:如果你要求去買一些東西:板燒雞腿漢堡,可樂薯?xiàng)l,那么人們會(huì)非常自然的跑去麥當(dāng)勞去購(gòu)買對(duì)吧.

為什么我們會(huì)想到去麥當(dāng)勞呢?因?yàn)檫@些東西都是一類食物,然后麥當(dāng)勞作為一個(gè)"工廠",可以一條龍的提供給消費(fèi)者,如果沒有麥當(dāng)勞,那么我們需要分別去可樂,薯?xiàng)l和板燒雞腿漢堡的店面去分別買這些食物,那么購(gòu)買效率會(huì)很低.所以可以說(shuō)麥當(dāng)勞就是一個(gè)銷售食物的工廠模式.

所以我們可以這樣理解工廠模式,把相關(guān)的多個(gè)類(薯?xiàng)l,可樂等)提供一個(gè)統(tǒng)一入口的一個(gè)模式,讓你從一個(gè)入口就可以獲得多個(gè)類,提高工作效率.

但是對(duì)于工廠模式也會(huì)有三種類型的實(shí)現(xiàn)方式,分別是:簡(jiǎn)單工廠模式,工廠方法模式和抽象工廠模式.它們分別是在各自基礎(chǔ)上有一定的改進(jìn).

簡(jiǎn)單工廠模式

也被叫做靜態(tài)工廠模式(Simple Factory Patter),主要用于創(chuàng)建同一類的對(duì)象.

適用情況:如果被要求寫一些球類的實(shí)現(xiàn),那么一般情況的話我們會(huì)這樣實(shí)現(xiàn):

var Football = function(){
    this.name = "football";
    ....
}
var Basketball = function(){
    this.name = "basketball";
    ....
}

這種寫法有一些缺陷:返回了多個(gè)類,不便于他人使用.因此我們考慮把這些類似的類封裝到一個(gè)工廠里面,也就有了我們的簡(jiǎn)單工廠模式:

var BallFactory;
!(function(){
    BallFactory = function(type,cfg){
        var Football = function(cfg){
            this.name = "football";
            console.log(this.name + " in the prototype");
        };
        Football.prototype = {
            call:function(){console.log(this.name)},
            sell:function(){}
        };
        var Basketball = function(cfg) {
            this.name = "basketball";
            console.log(this.name);
        };

        var cfg = cfg ||{};
        switch(type){
            case "football":
                return new Football(cfg);
                break;
            case "basketball":
                return new Basketball(cfg);
                break;
        }
    };
})();

var aFootball = BallFactory("football");
aFootball.call();

因此使用BallFactory把這些內(nèi)容包裹起來(lái)給其他人使用就會(huì)避免返回了多個(gè)類的問題,所以這就是簡(jiǎn)單工廠模式想解決的問題:
統(tǒng)一創(chuàng)建的入口.

當(dāng)然在實(shí)際的使用過程中,我們會(huì)使用一些其它技巧:

如果工廠的產(chǎn)品中有很多重復(fù)部分,那么我們需要把重復(fù)的部分抽象出來(lái)成為共同的部分,不同的部分放入switch里面:

var GetChildren = function(cfg){
    cfg = cfg||{};
    this.name = cfg.name;
    this.height = cfg.height;
    this.speak = function(){};
    
    //抽離出不同的部分
    switch(cfg.gender){
        case "boy":
            this.gender = cfg.gender;
            this.moustouch = ....
            .....; //特有部分
            break; 
        case "girl":
            this.gender = cfg.gender;
            .......
            break;
    }
    return this;
}
var aBoy = GetChildren({.....}); 
工廠方法模式

在簡(jiǎn)單工廠模式的基礎(chǔ)上,我們已經(jīng)解決了入口不統(tǒng)一的問題,但是還有一個(gè)問題沒有解決:

加入一個(gè)新的類需要修改多部分:首先我們需要在BallFactory工廠內(nèi)部加入如何實(shí)現(xiàn),然后加到switch部分;所以這是一次修改的需求,我們需要修改多個(gè)地方.

那么我們看能不能嘗試更抽象一點(diǎn),盡可能減少需要修改的地方;

var BallFactory = function(type,cfg){
    this.name = cfg.name; //共同的部分放在這里
    return this[type](cfg);
};

BallFactory.prototype = {
    football:function(cfg){
        console.log("這里加入和football相關(guān)的獨(dú)特內(nèi)容" +this.name);
    },
    basketball:function(cfg) {
        console.log("這里加入和basketball相關(guān)的獨(dú)特內(nèi)容" +this.name);
    }
};
var aBall = new BallFactory("football",{name:"football"}); //football in the prototype

所以這里加入了一個(gè)return this[type](cfg)的方法自動(dòng)代替了之前的switch的方法.以后需要加入內(nèi)容只需要修改BallFactory的prototype就可以了.

當(dāng)然我們還可以添加一種安全模式來(lái)解決如果不在構(gòu)造函數(shù)前面加上new的話,會(huì)報(bào)錯(cuò)的問題.解決的思路其實(shí)是把new封裝在構(gòu)造函數(shù)之內(nèi):

var BallFactory = function(type,cfg){
    if(!(this instanceof BallFactory)){
        return new BallFactory(type,cfg); //多一行判斷即:如果沒有帶new,我自己幫你new一個(gè)返回就好;
    }
    this.name = cfg.name;
    return this[type](cfg);
};

var aBall = BallFactory("football",{name:"football"}); //這里如果掉了new也會(huì)正常執(zhí)行;

所以,我們可以看到的是,我們使用簡(jiǎn)單工廠模式解決了入口不統(tǒng)一的問題,然后使用工廠模式解決了修改地點(diǎn)不統(tǒng)一的問題

抽象工廠模式

一般來(lái)說(shuō),抽象工廠在大型項(xiàng)目的使用更多,大概的思路是在父類里面設(shè)計(jì)好接口(沒有具體實(shí)現(xiàn)),具體的實(shí)現(xiàn)等到了子類再重寫.

這里借用一個(gè)張容銘的的一個(gè)例子:

var Car = function(){};
Car.prototype = {
    getPrice:function(){ throw new Error("抽象方法不能調(diào)用")},
    getSpeed:function(){ throw new Error("抽象方法不能調(diào)用")}
};
//這里使用Object.create()繼承,子類到父類中會(huì)多一個(gè)中間過渡函數(shù)Temp(){};防止在子類的prototype覆蓋父類;可見參考資料
aBMW = Object.create(Car.prototype);
    
aBMW.getPrice();  // 抽象方法不能調(diào)用
aBMW.getPrice = function(){
    console.log("I am getting price");
};
aBMW.getPrice(); //I am getting price

父類定義好接口,具體實(shí)現(xiàn)延遲到子類才實(shí)現(xiàn).

所以總結(jié)來(lái)說(shuō):

簡(jiǎn)單工廠模式解決了入口不統(tǒng)一的問題,

工廠模式解決了修改地點(diǎn)不統(tǒng)一的問題,

抽象工廠模式解決了子類實(shí)現(xiàn)不規(guī)范的問題

參考資料

Javascript設(shè)計(jì)模式 張容銘

深入理解JavaScript系列(28):設(shè)計(jì)模式之工廠模式

工廠模式

Object.create()使用方式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91343.html

相關(guān)文章

  • javascript實(shí)現(xiàn)簡(jiǎn)單工廠模式

    摘要:從設(shè)計(jì)模式的分類來(lái)看簡(jiǎn)單工廠模式是創(chuàng)建型模式。使用簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中類的個(gè)數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。 簡(jiǎn)單工廠模式提供了一個(gè)接口可以根據(jù)傳遞的參數(shù)的不同創(chuàng)建不同的對(duì)象,從而將對(duì)象自身的邏輯與對(duì)象的創(chuàng)建分離開。 從設(shè)計(jì)模式的分類來(lái)看簡(jiǎn)單工廠模式是創(chuàng)建型模式。事實(shí)上與簡(jiǎn)單工廠模式類似的還...

    Code4App 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式-工廠方法模式

    摘要:工廠方法模式,通過對(duì)產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。安全模式類安全模式類可以屏蔽使用類的錯(cuò)誤造成的錯(cuò)誤。可以將工廠方法看作是一個(gè)實(shí)例化對(duì)象的工廠類,安全起見,采用安全模式類,將創(chuàng)建對(duì)象的基類放在工廠方法類的原型中即可。 工廠方法模式,通過對(duì)產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。前面記錄了簡(jiǎn)單工廠模式,但是需求時(shí)不斷變化的,當(dāng)需求簡(jiǎn)單時(shí),直接創(chuàng)建對(duì)象...

    shixinzhang 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式系列一:工廠模式

    摘要:設(shè)計(jì)模式共有種,我今天先來(lái)了解一下工廠模式,其他的模式將會(huì)在后續(xù)的博客中陸續(xù)為大家講解。工廠模式主要分為簡(jiǎn)單工廠模式和抽象工廠模式。抽象工廠模式抽象工廠模式與簡(jiǎn)單工廠函數(shù)不同的是,抽象工廠函數(shù)會(huì)先設(shè)計(jì)好接口,具體的實(shí)現(xiàn)在子類中進(jìn)行。 設(shè)計(jì)模式 設(shè)計(jì)模式(design pattern)概念:是一套反復(fù)使用、思想成熟、經(jīng)過分類和無(wú)數(shù)實(shí)戰(zhàn)設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。是為了代碼可重用、可擴(kuò)展、可解耦、更容...

    OldPanda 評(píng)論0 收藏0
  • JavaScript面向?qū)ο驩OM 2(JavaScript 創(chuàng)建對(duì)象的工廠模式和構(gòu)造函數(shù)模式

    摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對(duì)象經(jīng)歷了以下四個(gè)過程創(chuàng)建一個(gè)新對(duì)象構(gòu)造函數(shù)的作用域交給新對(duì)象。 ??在創(chuàng)建對(duì)象的時(shí)候,使用對(duì)象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)對(duì)象是最簡(jiǎn)單最方便的方式。但是凡是處于初級(jí)階段的事物都會(huì)不可避免的存在一個(gè)問題,沒有普適性,意思就是說(shuō)我要為世界上(程序中)的所有使用到的對(duì)象都使用一遍 var xxx = {} ,...

    you_De 評(píng)論0 收藏0
  • JavaScript面向?qū)ο驩OM 2(JavaScript 創(chuàng)建對(duì)象的工廠模式和構(gòu)造函數(shù)模式

    摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對(duì)象經(jīng)歷了以下四個(gè)過程創(chuàng)建一個(gè)新對(duì)象構(gòu)造函數(shù)的作用域交給新對(duì)象。 ??在創(chuàng)建對(duì)象的時(shí)候,使用對(duì)象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)對(duì)象是最簡(jiǎn)單最方便的方式。但是凡是處于初級(jí)階段的事物都會(huì)不可避免的存在一個(gè)問題,沒有普適性,意思就是說(shuō)我要為世界上(程序中)的所有使用到的對(duì)象都使用一遍 var xxx = {} ,...

    liuchengxu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

feng409

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<