一、介绍
如果我们有多个工厂,这个时候我们就需要管理我们的工厂,可以创建一个大工厂来分别管理小工厂。而我们抽象工厂的作用就是为工厂制定规则,制定他的结构和功能。我们在创建同一类别的工厂时,只需要继承抽象工厂的结构,然后进行重写即可。
二、优点
抽象工厂可以把工厂的结构抽象出来,访问者不需要知道具体的实现,只需要面向具体的结构编程即可。
三、缺点
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的规则,这里我就不展开写了,就是对它的缺点做一个体现。