工厂逻辑就是流水线机器,买好了就无法更改
这就是开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改
做一个手机,要先出设计方案,比如手机由操作系统和硬件注组成 设计方案就是抽象手机工厂
class MobilePhoneFactory {
// 提供操作系统的接口
createOS() {
throw new Error('抽象方法不允许直接调用,你需要将我重写!')
}
// 提供硬件的接口
createHardWare() {
throw new Error('抽象方法不允许直接调用,你需要将我重写!')
}
}
随后由具体手机工厂干活,具体手机工厂搭建了就不会改变了
// 具体工厂继承自抽象工厂
class FakeStarFactory extends MobilePhoneFactory {
createOS() {
// 提供安卓系统实例
return new AndroidOS()
}
createHardWare() {
// 提供高通硬件实例
return new QualcommHardWare()
}
}
具体手机工厂可以选择具体部件
具体部件工厂也需要抽象部件工厂,也就是部件的设计方案
// 定义操作系统这类部件的抽象部件类
class OS {
controlHardWare() {
throw new Error('抽象方法不允许直接调用,你需要将我重写!')
}
}
// 定义具体操作系统的具体部件类
class AndroidOS extends OS {
controlHardWare() {
console.log('我会用安卓的方式去操作硬件')
}
}
class AppleOS extends OS {
controlHardWare() {
console.log('我会用🍎的方式去操作硬件')
}
}
这里部件有两个具体部件工厂,上方的旧款手机工厂使用 AndroidOS 部件工厂
新款手机只需要根据设计方案重新建一个使用新款 AppleOS 部件工厂的手机就可以了
抽象工厂是将创建简单工厂的过程设计出来,解决的是创建多个简单工厂的问题