JavaScript設(shè)計(jì)模式之抽象工廠模式

一、介紹

如果我們有多個(gè)工廠,這個(gè)時(shí)候我們就需要管理我們的工廠,可以創(chuàng)建一個(gè)大工廠來(lái)分別管理小工廠。而我們抽象工廠的作用就是為工廠制定規(guī)則,制定他的結(jié)構(gòu)和功能。我們?cè)趧?chuàng)建同一類別的工廠時(shí),只需要繼承抽象工廠的結(jié)構(gòu),然后進(jìn)行重寫即可。

二、優(yōu)點(diǎn)

抽象工廠可以把工廠的結(jié)構(gòu)抽象出來(lái),訪問者不需要知道具體的實(shí)現(xiàn),只需要面向具體的結(jié)構(gòu)編程即可。

三、缺點(diǎn)

1.在結(jié)構(gòu)需要改動(dòng)的情況下,需要修改抽象工廠,違反開閉原則,帶來(lái)大量工作。
2.會(huì)產(chǎn)生更多的類,和更多的繼承關(guān)系。

四、示例

class FactoriesRule {//抽象工廠
    constructor(){
        if(new.target === FactoriesRule){
            throw new Error("抽象工廠不能被實(shí)例化")
        }
    }
    get(type){
        throw new Error("抽象工廠的方法不能被調(diào)用")
    }
}
class Factories extends FactoriesRule{//總工廠
    constructor(){
        super();
    }
    get(type){
        var obj = {
            student:new Student(),
            teacher:new Teacher(),
        }
        if(obj[type]){
            return obj[type];
        }else {
            throw new Error("不存在該工廠")
        }
    }
}
class Rule {//抽象工廠
    constructor(){
        if(new.target === Rule){
            throw new Error("抽象工廠不能被實(shí)例化")
        }
    }
    getList(){
        throw new Error("抽象工廠的方法不能被調(diào)用")
    }
}
class Student extends Rule{
    constructor(){
        super()
    }
    getList(){
        return ["小明","小剛","小美","小麗"];
    }
}
class Teacher extends Rule{
    constructor(){
        super()
    }
    getList(){
        return ["趙老師","錢老師","孫老師","李老師"];
    }
}
const factories = new Factories();//總工廠
const student = factories.get("student");//學(xué)生工廠
console.log(student.getList());//學(xué)生名單
const teacher = factories.get("teacher");//老師工廠
console.log(teacher.getList());//老師名單

如果我們的大工廠現(xiàn)在是陽(yáng)光小學(xué)的工廠,那現(xiàn)在我們要?jiǎng)?chuàng)建一個(gè)實(shí)驗(yàn)小學(xué)的工廠就變得很簡(jiǎn)單,只需要繼承一下抽象工廠的規(guī)則然后就行重寫就可以了。簡(jiǎn)單一點(diǎn)就是:

class ShiYan extends FactoriesRule{//實(shí)驗(yàn)小學(xué)工廠
    constructor(){
        super();
    }
    get(type){
        var obj = {
            student:new Student(),
            teacher:new Teacher(),
        }
        if(obj[type]){
            return obj[type];
        }else {
            throw new Error("不存在該工廠")
        }
    }
}
const shiyan = new ShiYan();//總工廠
const shiyanStudent = shiyan.get("student");//學(xué)生工廠
console.log(shiyanStudent.getList());//學(xué)生名單
const shiyanTeacher = shiyan.get("teacher");//老師工廠
console.log(shiyanTeacher.getList());//老師名單

但是現(xiàn)在我們的工廠里面只能查詢學(xué)生和老師的名單,那我們要招生或者招聘新的老師怎么辦呢。就只能重寫我們的抽象工廠,添加add的規(guī)則,這里我就不展開寫了,就是對(duì)它的缺點(diǎn)做一個(gè)體現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容