工厂模式分为两种:简单工厂、抽象工厂
简单工厂就是创建对象,将多个相似的类(对象)的相似部分提取出来,不相似的地方做针对想的处理
有个需求就是需要你将一个公司不同的工种进行分配他们的基本属性和职能属性,通过上篇文章构造器篇写了录入员工信息的例子,知道了有共性属性的时候就可以拆出来封装在一个类中
function Employee(name,age){
this.name = name
this.age = age
}
const A = new Employee('老弟',25)
const B = new Employee('老妹',25)
console.log(A.toString())
接着就是职能属性
function Employee(name,age,work,things){
this.name = name
this.age = age
this.work = work //工种
this.things = things //需要做的事情
}
但是问题来了,我不可能每次都在里面写判断是什么工种然后再去分配他们需要做的事情,所以我们需要在写多一个类去判断
function Employee(name,age,work,things){
this.name = name
this.age = age
this.work = work //工种
this.things = things //需要做的事情
}
function factory(name,age,work){
let things
switch(work){
case 'A':
things = ['端茶','倒水']
break
case 'B':
things = ['写bug','修bug']
break
case 'C':
things = ['带薪拉s','聊qq']
break
}
return new Employee(name,age,work,things)
}
还可以做权限控制,例如超级管理员,管理员,游客等,每个不同的用户不同权限
简单工厂是直接生成实例,但是抽象工厂不同,而是对产品类簇的创建。
上面的factory方法里面有多个职位,但是每多个职位就要去修改一次factory方法体,不符合我们的开放封闭原则。可扩展,但不可修改。
举个例子
部门是有地方和职务组成(暂时就用这两个)
class DepartmentFactory{
createPosition(){
throw new Error("抽象工厂方法不允许直接调用,需要重写!!!!")
}
createPost(){
throw new Error("抽象工厂方法不允许直接调用,需要重写!!!!")
}
}
抽象工厂不干活,那就得找个工厂来干货,那就出现了具体工厂,知道了位置和职务之后,就可以将抽象化为具体了。比如我现在要成立一个清洁部门
//具体工厂
class cleardepartFactory extends DepartmentFactory{
createPosition(){
//部门地点
return new clearPosition()
}
createPost(){
//部门的职责
return new clearPost()
}
}
在我们成立清洁部门的时候调用了两个构造函数clearPosition和clearPost,一个是部门位置一个是岗位职责。被new出来的实例就叫做具体产品类。不同的具体产品类往往会伴随着不同的功能。因此我们可以创建一个抽象产品类来声明这类具有的基本功能
//首先定义部门的抽象产品类
class abstractPos{
abstractPosi(){
throw new Error("抽象产品方法不允许直接调用,需要重写!!!!")
}
}
//具体产品类
class PositionAb extends abstractPos{
abstractPosi(){
console.log('清洁部门的地方')
}
}
//同理,部门职责也是一样
class abstractPost {
abstractPost() {
throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
}
}
class PostAb extends abstractPost {
abstractPost(){
console.log('清洁部门的职责')
}
}
ok,当我们要新增一个部门的时候
//新部门
const newdepartment = new cleardepartFactory()
//部门地点
const newPosition = newdepartment.createPosition()
//部门职责
const newPost= newdepartment.createPost()
//清洁部门的位置
newPosition.abstractPosi()
//清洁部门的职责
newPost.abstractPost()
滴滴滴,问题来了,如果要新建多一个部门怎么办,应该都猜到了吧,不需要再对抽象工厂DepartmentFactory做修改了,只需要继续拓展它
class newCleardepartFactory extends DepartmentFactory {
createPosition() {
// 位置
}
createPost() {
// 职责
}
}
这操作就符合了开放封闭的原则了。