设计模式——工厂模式|青训营笔记

107 阅读2分钟

这是我参与【第四届青训营】笔记创作活动的第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 牌手机。