JavaScript设计模式之抽象工厂模式

一、介绍

如果我们有多个工厂,这个时候我们就需要管理我们的工厂,可以创建一个大工厂来分别管理小工厂。而我们抽象工厂的作用就是为工厂制定规则,制定他的结构和功能。我们在创建同一类别的工厂时,只需要继承抽象工厂的结构,然后进行重写即可。

二、优点

抽象工厂可以把工厂的结构抽象出来,访问者不需要知道具体的实现,只需要面向具体的结构编程即可。

三、缺点

1.在结构需要改动的情况下,需要修改抽象工厂,违反开闭原则,带来大量工作。
2.会产生更多的类,和更多的继承关系。

四、示例

class FactoriesRule {//抽象工厂
    constructor(){
        if(new.target === FactoriesRule){
            throw new Error("抽象工厂不能被实例化")
        }
    }
    get(type){
        throw new Error("抽象工厂的方法不能被调用")
    }
}
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("抽象工厂不能被实例化")
        }
    }
    getList(){
        throw new Error("抽象工厂的方法不能被调用")
    }
}
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");//学生工厂
console.log(student.getList());//学生名单
const teacher = factories.get("teacher");//老师工厂
console.log(teacher.getList());//老师名单

如果我们的大工厂现在是阳光小学的工厂,那现在我们要创建一个实验小学的工厂就变得很简单,只需要继承一下抽象工厂的规则然后就行重写就可以了。简单一点就是:

class ShiYan extends FactoriesRule{//实验小学工厂
    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");//学生工厂
console.log(shiyanStudent.getList());//学生名单
const shiyanTeacher = shiyan.get("teacher");//老师工厂
console.log(shiyanTeacher.getList());//老师名单

但是现在我们的工厂里面只能查询学生和老师的名单,那我们要招生或者招聘新的老师怎么办呢。就只能重写我们的抽象工厂,添加add的规则,这里我就不展开写了,就是对它的缺点做一个体现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容