解析JavaScript的工厂模式

前言

相信有的小伙伴在学习JS时总会听到一个概念叫设计模式,很多小伙伴也会好奇它是干什么的。首先设计模式是软件开发常用解决问题的经验总结,用于特定的情境下复用,它没有语言的限制,它存在的目的就是为了提高代码的可维护性,可扩展性和重用性。

工厂模式简介

JavaScript总共有23种设计模式,下面我们介绍的就是一种常用的设计模式——工厂模式工厂模式给我们提供了一种灵活的方式来创建对象。通过使用工厂模式函数或者方式,我们可以封装对象的创建过程,然后通过原型链继承并根据不同参数或者条件生成很多相似的对象实例(和流水线生产相似)。

工厂模式给我们带来的好处使我们的代码更加的可扩展,可维护,并提供了抽象接口来创建对象。该接口跟我们传入的参数或条件来动态的创建对象。

下面我就介绍两种不同的工厂模式,分别为简单工厂模式和复杂工厂模式。

简单工厂模式

简单工厂模式(Simple Factory Pattern)通俗来讲就是先创建一个工厂对象,再由这个工厂对象来创建某一类产品的实例。

我来看一段简单工厂模式的代码:

function User(name, age, career, work) {
    this.name = name
    this.age = age
    this.career = career
    this.work = work
}
function Factory(name, age, career) {
  let work;
  switch(career) {
    case 'coder':
      work = ['写代码', '改bug', '骂产品']
      break
    case 'product manager':
      work = ['订会议室', '画原型图', '催更']
      break
    // ...
  }
  return new User(name, age, career, work)
}

在上述代码中,我们可以看到,我们直接定义了User实例对象内含有四个属性,分别为nameagecareerwork, 该四个属性就我们产品需要的属性。下面我们再定义一个Factory工厂对象, 根据传入的career来为产品生产work属性,之后我们只要使用该工厂对象来为我们生产产品实例。

那简单工厂模式有什么优缺点呢?

优点:

  1. 简单了对象的创建过程,无需知道具体产品的创建细节
  2. 使代码高内聚低耦合,将创建和使用分离
  3. 集中管理对象创建,降低代码复杂度

缺点:

  1. 不符合开闭原则,如果需要新增产品,需要修改工厂类逻辑
  2. 不易扩展和维护,只能做单一的事
  3. 违背单一职责原则,即创建了对象又创建了产品

抽象工厂模式

上面介绍完了简单抽象模式,相信大家也就对工厂模式有了一个初步的了解,那下面绕的来了。

抽象工厂模式(Abstract Factory Pattern)是提供一个接口用于创建一系列相关或相互依赖的对象,无需指定具体的类。

我们再来看一段抽象工厂模式的代码:

// 我们以手机生产为例子
class MobilePhoneFactory { // 这是手机工厂实例
  // 操作系统
  createOS() {  
    throw new Error('抽象工厂方法不允许直接调用,需要重写')
  }
  // 硬件
  createHardWare() {
    throw new Error('抽象工厂方法不允许直接调用,需要重写')
  }
}
class Banana 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('苹果式操作硬件');
  }
}

class HardWare { // 这是硬件实例
  operateByOrder() {
    throw new Error('抽象工厂方法不允许直接调用,需要重写')
  }
}
class QualcommHardWare extends HardWare { // 选择硬件方法
  operateByOrder() {
    console.log('高通的方式运行');
  }
}
class MiWare extends HardWare { // 选择硬件方法
  operateByOrder() {
    console.log('小米的方式运行');
  }
}

// 手机生产
const myPhone = new Banana() 
const myOS = myPhone.createOS()
const myHardWare = myPhone.createHardWare()
myOS.controlHardWare()
myHardWare.operateByOrder()

在上述代码中,我们可以看到,我们先定义了一个手机生产工厂MobilePhoneFactory,接下来再定义了一个组装车间Banana,之后我们定义了两个生产车间OSHardWare、最后我们在每个生产车间定义了两条不同的生产线,分别是OS车间的AndroidOSAndroidOSHardWare车间的QualcommHardWareMiWare

我们先选好工厂,再选择生产车间,再选择生产线,再在组装车间进行组装。这样我们这个工厂就生产出了一个完整的产品。

那简单工厂模式又有什么优缺点呢?

优点:

  1. 封装变化:如需生产不同系列的产品,我们只需要更换生产线即可,让客户端与具体产品的创建逻辑解耦。
  2. 提供一致性:它提供了一组创建的方法,保证了创建的产品之间的一致性。
  3. 符合开闭原则:我们可以通过添加具体生产线来生产出对应产品,满足了客户不断变化的需求

缺点:

  1. 难以支持新的产品等级结构:只能生产一套固定模式的产品,如需增加产品结构,则需修改抽象工厂的接口和子类。
  2. 增加了系统复杂度: 抽象工厂在增加新产品时会增加具体工厂数量,从而增加系统的复杂度。

结语

总的来说,工厂模式是一种简单,灵活,可扩展的创新型设计模式。是一种开箱即用的产品,也是我们在日常开发中常用到的模式,通过该模式可以大大降低我们代码的耦合度,也使代码维护性,灵活性变高。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYCSO5l2' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片