这是我参与【第四届青训营】笔记创作活动的第31天。
在现实生活中,为了满足人们的生活需要,有各种大大小小的工厂按照既定程序制造产品,只需要改变生产原料和流程,工厂就能为我们生产出不同的产品。我们将其对应到工厂模式中,工厂就像是一个可以批量制造其他对象的对象,而我们只需要调用工厂这个对象,并向其传入不同的参数,它就可以为我们制造出不同的其他对象。
以此为例,我们来构造一个简单的手机工厂来生产手机。
我们知道,一部完整的手机可以分为手机自身的硬件和其中安装的操作系统。因此,我们可以先抽象出一个工厂用来生产手机。
class MobilePhoneFactory { // 抽象手机工厂
// 操作系统
createOS() {
throw new Error('抽象工厂方法不允许直接调用,需要重写')
}
// 硬件
createHardWare() {
throw new Error('抽象工厂方法不允许直接调用,需要重写')
}
}
当然,这只是抽象出了一个工厂的外壳,想要工厂正常运作,还要将其真正建立起来。在这里,我们决定创建一个名为 Banana 的工厂,用来生产使用安卓系统、高通硬件的 Banana 牌手机。
class Banana extends MobilePhoneFactory{
createOS() {
return new AndroidOS()
}
createHardWare() {
return new QualcommHardWare()
}
}
这样,手机工厂的外壳就已经建好了,但是工厂内部的操作系统和硬件的生产车间也不能落下。
class OS { // 抽象操作系统
controlHardWare() {
throw new Error('抽象工厂方法不允许直接调用,需要重写')
}
}
class AndroidOS extends OS{ // 创建一个 AndroidOS 系统
controlHardWare() {
console.log('我会用安卓的方式操作硬件');
}
}
class HardWare { // 抽象硬件
operateByOrder() {
throw new Error('抽象工厂方法不允许直接调用,需要重写')
}
}
class QualcommHardWare extends HardWare { // 创建一个 QualcommHardWare 硬件
operateByOrder() {
console.log('我会用高通的方式运行');
}
}
到这里,这个手机生产工厂的就已经搭建完成了。
测试一下:
const myPhone = new Banana()
const myOS = myPhone.createOS()
const myHardWare = myPhone.createHardWare()
myOS.controlHardWare()
myHardWare.operateByOrder()
输出:
我会用安卓的方式操作硬件
我会用高通的方式运行
这样,我们就得到了一部使用安卓系统、高通硬件的 Banana 牌手机。