JavaScript 设计模式:工厂模式

5 阅读2分钟

什么是工厂模式?

工厂模式是一种创建型设计模式,核心思想是将对象的实例化过程封装到一个函数(工厂)中,调用者无需关心对象的具体创建细节,只需通过统一接口传递参数即可获得所需对象。这种模式尤其适合以下场景:

  • 对象创建逻辑复杂(如依赖不同配置)
  • 需要根据不同条件生成不同对象
  • 希望隔离创建逻辑与业务代码

工厂模式实战:用户权限系统

假设我们需实现一个用户权限系统,不同角色(superadmin/admin/editor)拥有不同页面访问权限。以下是用工厂模式的实现

function UserFactory(role: string) {
  function User(role: string, pages: string[]) {
    this.role = role
    this.pages = pages
  }

  switch (role) {
    case 'superadmin':
      return new User('superadmin', ['home', 'user-manage', 'right-manage', 'news-manage'])
    case 'admin':
      return new User('admin', ['home', 'user-manage', 'news-manage'])
    case 'editor':
      return new User('editor', ['home', 'news-manage'])
    default:
      throw new Error('角色参数错误')
  }
}

// 使用示例
const admin = UserFactory('admin')
console.log(admin) // User { role: 'admin', pages: [...] }


// ES6 Class 实现
class User {
  constructor(role, pages) {
    this.role = role
    this.pages = pages
  }
}

class UserFactory {
  static createUser(role) {
    switch (role) {
      case 'superadmin':
        return new User(role, ['home', 'user-manage', 'right-manage', 'news-manage'])
      case 'admin':
        return new User(role, ['home', 'user-manage', 'news-manage'])
      case 'editor':
        return new User(role, ['home', 'news-manage'])
      default:
        throw new Error('Invalid role')
    }
  }
}

// 使用示例
const editor = UserFactory.createUser('editor')

代码解析

  • 工厂函数UserFactory 接收角色参数,内部封装对象创建逻辑
  • 对象构造User 构造函数定义对象结构,与工厂解耦
  • 条件分支switch 根据角色返回对应权限配置,符合开闭原则(扩展时只需新增分支)

工厂模式的优势

  • 降低耦合:调用方与具体类解耦,只需关注接口
  • 易于扩展:新增角色时只需修改工厂逻辑,不影响现有代码
  • 统一管理:集中处理对象创建时的校验、日志等逻辑

适用场景

  • 动态权限系统(如本文案例)
  • UI组件库(根据不同参数生成按钮、弹窗等)
  • 数据模型转换(如根据API响应生成不同数据对象)

延伸思考:何时不用工厂模式?

若对象创建逻辑极其简单(如直接 new User()),过度使用工厂模式反而会增加代码层级。设计模式是工具,而非目标,合理选择才能发挥价值。

总结

工厂模式通过抽象化对象创建过程,让代码更灵活、更易维护。掌握其核心思想,结合实际场景合理运用,能显著提升代码质量。在你的下一个项目中,试试用它来解决对象创建复杂度吧!