0%

抽象工厂模式

前情回顾

在实际的项目开发时, 我们面对的往往不是如此简单的工厂, 而是会面对多个工厂.

在简单工厂模式中, 如果我们再加入学生会干部, 就意味着我们需要修改我们的工厂函数. 长此以往, 我们的工厂函数会变得复杂臃肿.

回顾我们设计模式的开放封闭原则, 对扩展开放, 对修改封闭 而我们添加其他判断逻辑则是在修改它.

所以我们需要一个更加合理的方式来处理

抽象工厂模式

由于抽象最初源于 Java 等强类型静态语言, 在设计初期, 往往就需要关注类型解耦. 而 JavaScript 是一个动态类型的语言, 天然具有多态性, 但目前的 JavaScript 语法里,不支持抽象类的直接实现, 所以我们只能模拟抽象类.

实现一个生产手机的抽象工厂

一个手机生产线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 抽象工厂-只对类抽象的对象基本组成进行约束
class PhoneFactory {
createOs() {
throw new Error('抽象工厂创建软件系统方法, 需要重写')
}
createHardware() {
throw new Error('抽象工厂创建硬件方法, 需要重写')
}
}

// 具体工厂-实现具体功能
class FakeStarFactory extends PhoneFactory {
createOs() {
return new IOS()
}
createHardware() {
return new MI()
}
}

抽象出系统部分的抽象工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 抽象手机系统工厂
class OS {
run() {
throw new Error('抽象工厂, 不允许直接调用')
}
}

// 具体运行系统工厂
class Ios extends OS {
run() {
console.log('用ios系统方式启动')
}
}
class Android extends OS {
run() {
console.log('用安卓系统启动')
}
}

抽象出硬件的抽象工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 抽象硬件类
class Hardware {
operating() {
throw new Error('抽象工厂方法, 不允许直接调用')
}
}

// 具体工厂
class MI extends Hardware {
operating() {
console.log('使用小米硬件')
}
}
class HUAWEI extends Hardware {
operating() {
console.log('使用华为硬件')
}
}

开始生产手机

1
2
3
4
5
const phone = new FakeStarFactory() // 生产手机
const phoneOs = phone.createOs() // 加上系统
const phonrHardware = phone.createHardware() // 加上硬件
phonrHardware.operating() // 选择硬件
phoneOs.run() // 运行系统
请作者喝杯咖啡