1. 
          

          1. 新聞動(dòng)態(tài)

            說(shuō)說(shuō)對工廠(chǎng)模式的理解?應用場(chǎng)景?

            常見(jiàn)問(wèn)題 發(fā)布者:ou3377 2021-12-16 17:29 訪(fǎng)問(wèn)量:139

            圖片

            一、是什么

            工廠(chǎng)模式是用來(lái)創(chuàng )建對象的一種最常用的設計模式,不暴露創(chuàng )建對象的具體邏輯,而是將將邏輯封裝在一個(gè)函數中,那么這個(gè)函數就可以被視為一個(gè)工廠(chǎng)

            其就像工廠(chǎng)一樣重復的產(chǎn)生類(lèi)似的產(chǎn)品,工廠(chǎng)模式只需要我們傳入正確的參數,就能生產(chǎn)類(lèi)似的產(chǎn)品

            舉個(gè)例子:

            • 編程中,在一個(gè) A 類(lèi)中通過(guò) new 的方式實(shí)例化了類(lèi) B,那么 A 類(lèi)和 B 類(lèi)之間就存在關(guān)聯(lián)(耦合)
            • 后期因為需要修改了 B 類(lèi)的代碼和使用方式,比如構造函數中傳入參數,那么 A 類(lèi)也要跟著(zhù)修改,一個(gè)類(lèi)的依賴(lài)可能影響不大,但若有多個(gè)類(lèi)依賴(lài)了 B 類(lèi),那么這個(gè)工作量將會(huì )相當的大,容易出現修改錯誤,也會(huì )產(chǎn)生很多的重復代碼,這無(wú)疑是件非常痛苦的事;
            • 這種情況下,就需要將創(chuàng )建實(shí)例的工作從調用方(A類(lèi))中分離,與調用方「解耦」,也就是使用工廠(chǎng)方法創(chuàng )建實(shí)例的工作封裝起來(lái)(「減少代碼重復」),由工廠(chǎng)管理對象的創(chuàng )建邏輯,調用方不需要知道具體的創(chuàng )建過(guò)程,只管使用,「而降低調用者因為創(chuàng )建邏輯導致的錯誤」;

            二、實(shí)現

            工廠(chǎng)模式根據抽象程度的不同可以分為:

            • 簡(jiǎn)單工廠(chǎng)模式(Simple Factory)
            • 工廠(chǎng)方法模式(Factory Method)
            • 抽象工廠(chǎng)模式(Abstract Factory)

            簡(jiǎn)單工廠(chǎng)模式

            簡(jiǎn)單工廠(chǎng)模式也叫靜態(tài)工廠(chǎng)模式,用一個(gè)工廠(chǎng)對象創(chuàng )建同一類(lèi)對象類(lèi)的實(shí)例

            假設我們要開(kāi)發(fā)一個(gè)公司崗位及其工作內容的錄入信息,不同崗位的工作內容不一致

            代碼如下:

            function Factory(career{
                function User(career, work{
                    this.career = career 
                    this.work = work
                }
                let work
                switch(career) {
                    case 'coder':
                        work =  ['寫(xiě)代碼''修Bug'
                        return new User(career, work)
                        break
                    case 'hr':
                        work = ['招聘''員工信息管理']
                        return new User(career, work)
                        break
                    case 'driver':
                        work = ['開(kāi)車(chē)']
                        return new User(career, work)
                        break
                    case 'boss':
                        work = ['喝茶''開(kāi)會(huì )''審批文件']
                        return new User(career, work)
                        break
                }
            }
            let coder = new Factory('coder')
            console.log(coder)
            let boss = new Factory('boss')
            console.log(boss)

            Factory就是一個(gè)簡(jiǎn)單工廠(chǎng)。當我們調用工廠(chǎng)函數時(shí),只需要傳遞name、age、career就可以獲取到包含用戶(hù)工作內容的實(shí)例對象

            工廠(chǎng)方法模式

            工廠(chǎng)方法模式跟簡(jiǎn)單工廠(chǎng)模式差不多,但是把具體的產(chǎn)品放到了工廠(chǎng)函數的prototype

            這樣一來(lái),擴展產(chǎn)品種類(lèi)就不必修改工廠(chǎng)函數了,變成抽象類(lèi),也可以隨時(shí)重寫(xiě)某種具體的產(chǎn)品

            也就是相當于工廠(chǎng)總部不生產(chǎn)產(chǎn)品了,交給下轄分工廠(chǎng)進(jìn)行生產(chǎn);但是進(jìn)入工廠(chǎng)之前,需要有個(gè)判斷來(lái)驗證你要生產(chǎn)的東西是否是屬于我們工廠(chǎng)所生產(chǎn)范圍,如果是,就丟給下轄工廠(chǎng)來(lái)進(jìn)行生產(chǎn)

            如下代碼:

            // 工廠(chǎng)方法
            function Factory(career){
                if(this instanceof Factory){
                    var a = new this[career]();
                    return a;
                }else{
                    return new Factory(career);
                }
            }
            // 工廠(chǎng)方法函數的原型中設置所有對象的構造函數
            Factory.prototype={
                'coder'function(){
                    this.careerName = '程序員'
                    this.work = ['寫(xiě)代碼''修Bug'
                },
                'hr'function(){
                    this.careerName = 'HR'
                    this.work = ['招聘''員工信息管理']
                },
                'driver'function ({
                    this.careerName = '司機'
                    this.work = ['開(kāi)車(chē)']
                },
                'boss'function(){
                    this.careerName = '老板'
                    this.work = ['喝茶''開(kāi)會(huì )''審批文件']
                }
            }
            let coder = new Factory('coder')
            console.log(coder)
            let hr = new Factory('hr')
            console.log(hr)

            工廠(chǎng)方法關(guān)鍵核心代碼是工廠(chǎng)里面的判斷this是否屬于工廠(chǎng),也就是做了分支判斷,這個(gè)工廠(chǎng)只做我能做的產(chǎn)品

            抽象工廠(chǎng)模式

            上述簡(jiǎn)單工廠(chǎng)模式和工廠(chǎng)方法模式都是直接生成實(shí)例,但是抽象工廠(chǎng)模式不同,抽象工廠(chǎng)模式并不直接生成實(shí)例, 而是用于對產(chǎn)品類(lèi)簇的創(chuàng )建

            通俗點(diǎn)來(lái)講就是:簡(jiǎn)單工廠(chǎng)和工廠(chǎng)方法模式的工作是生產(chǎn)產(chǎn)品,那么抽象工廠(chǎng)模式的工作就是生產(chǎn)工廠(chǎng)的

            由于JavaScript中并沒(méi)有抽象類(lèi)的概念,只能模擬,可以分成四部分:

            • 用于創(chuàng )建抽象類(lèi)的函數
            • 抽象類(lèi)
            • 具體類(lèi)
            • 實(shí)例化具體類(lèi)

            上面的例子中有coder、hr、boss、driver四種崗位,其中coder可能使用不同的開(kāi)發(fā)語(yǔ)言進(jìn)行開(kāi)發(fā),比如JavaScript、Java等等。那么這兩種語(yǔ)言就是對應的類(lèi)簇

            示例代碼如下:

            let CareerAbstractFactory = function(subType, superType{
              // 判斷抽象工廠(chǎng)中是否有該抽象類(lèi)
              if (typeof CareerAbstractFactory[superType] === 'function') {
                // 緩存類(lèi)
                function F({}
                // 繼承父類(lèi)屬性和方法
                F.prototype = new CareerAbstractFactory[superType]()
                // 將子類(lèi)的constructor指向父類(lèi)
                subType.constructor = subType;
                // 子類(lèi)原型繼承父類(lèi)
                subType.prototype = new F()
              } else {
                throw new Error('抽象類(lèi)不存在')
              }
            }

            上面代碼中CareerAbstractFactory就是一個(gè)抽象工廠(chǎng)方法,該方法在參數中傳遞子類(lèi)和父類(lèi),在方法體內部實(shí)現了子類(lèi)對父類(lèi)的繼承

            三、應用場(chǎng)景

            從上面可看到,簡(jiǎn)單簡(jiǎn)單工廠(chǎng)的優(yōu)點(diǎn)就是我們只要傳遞正確的參數,就能獲得所需的對象,而不需要關(guān)心其創(chuàng )建的具體細節

            應用場(chǎng)景也容易識別,有構造函數的地方,就應該考慮簡(jiǎn)單工廠(chǎng),但是如果函數構建函數太多與復雜,會(huì )導致工廠(chǎng)函數變得復雜,所以不適合復雜的情況

            抽象工廠(chǎng)模式一般用于嚴格要求以面向對象思想進(jìn)行開(kāi)發(fā)的超大型項目中,我們一般常規的開(kāi)發(fā)的話(huà)一般就是簡(jiǎn)單工廠(chǎng)和工廠(chǎng)方法模式會(huì )用的比較多一些

            綜上,工廠(chǎng)模式適用場(chǎng)景如下:

            • 如果你不想讓某個(gè)子系統與較大的那個(gè)對象之間形成強耦合,而是想運行時(shí)從許多子系統中進(jìn)行挑選的話(huà),那么工廠(chǎng)模式是一個(gè)理想的選擇
            • 將new操作簡(jiǎn)單封裝,遇到new的時(shí)候就應該考慮是否用工廠(chǎng)模式;
            • 需要依賴(lài)具體環(huán)境創(chuàng )建不同實(shí)例,這些實(shí)例都有相同的行為,這時(shí)候我們可以使用工廠(chǎng)模式,簡(jiǎn)化實(shí)現的過(guò)程,同時(shí)也可以減少每種對象所需的代碼量,有利于消除對象間的耦合,提供更大的靈活性



            關(guān)鍵字: 工廠(chǎng)模式

            文章連接: http://www.gostscript.com/cjwt/827.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.