#抽象工厂

工厂逻辑就是流水线机器,买好了就无法更改

这就是开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改

#抽象工厂模式

做一个手机,要先出设计方案,比如手机由操作系统和硬件注组成 设计方案就是抽象手机工厂

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 部件工厂的手机就可以了

#小结

抽象工厂是将创建简单工厂的过程设计出来,解决的是创建多个简单工厂的问题