JavaScript 设计模式:抽象工厂模式

55 阅读2分钟

什么是抽象工厂模式?

抽象工厂模式是创建型设计模式的进阶形态,其核心是

  • 不直接创建具体对象,而是定义产品族的创建规范
  • 隔离具体类,客户端只需面向抽象接口编程
  • 更适合需要统一创建多个关联对象的场景

抽象工厂实战:用户权限系统

以下是通过 TypeScript 实现的用户角色类簇系统

// 抽象产品基类:定义用户通用结构
abstract class User {
  private name: string  // 私有属性:用户名

  // 构造函数初始化用户名
  constructor(name: string) {
    this.name = name
  }

  // 公共方法:欢迎语(已实现)
  public welcome() {
    console.log(`欢迎回来,${this.name}`)
  }

  // 抽象方法:数据展示(需子类实现)
  public abstract datashow(): void
}

// 具体产品类:编辑角色
class Editor extends User {
  private role: string
  private pages: string[]

  constructor(name: string) {
    super(name)
    this.role = 'editor'
    this.pages = ['home', 'news-manage']  // 编辑可访问页面
  }

  // 实现抽象方法
  public datashow() {
    console.log(`[编辑] ${this.name} 的数据看板`)
  }

  // 特有方法:添加权限
  public addRight() {
    console.log('编辑权限设置')
  }
}

// 具体产品类:超级管理员
class SuperAdmin extends User {
  private role: string
  private pages: string[]

  constructor(name: string) {
    super(name)
    this.role = 'superadmin'
    this.pages = ['home', 'news-manage', 'user-manage']  // 管理员专属页面
  }

  // 实现抽象方法
  public datashow() {
    console.log(`[超级管理员] ${this.name} 的系统监控`)
  }

  // 特有方法:用户管理
  public addUser() {
    console.log('新增用户')
  }
}

// 抽象工厂接口(关键!)
interface UserFactory {
  createUser(name: string): User
}

// 具体工厂:生成编辑实例
class EditorFactory implements UserFactory {
  public createUser(name: string): Editor {
    return new Editor(name)  // 返回具体产品
  }
}

// 具体工厂:生成管理员实例
class SuperAdminFactory implements UserFactory {
  public createUser(name: string): SuperAdmin {
    return new SuperAdmin(name)
  }
}

// 使用示例
const editorFactory = new EditorFactory()
const user1 = editorFactory.createUser('张三')
user1.welcome()  // 输出:欢迎回来,张三
user1.datashow() // 输出:[编辑] 张三 的数据看板

代码解析

  • 抽象产品层(User)
    • 通过 abstract class 定义用户通用属性和方法
    • datashow() 声明为抽象方法,强制子类实现
  • 具体产品层Editor/SuperAdmin
    • 实现抽象类定义的行为约束
    • 可扩展特有方法(如 addUser()
  • 抽象工厂层UserFactory
    • 接口定义统一的创建规范
    • 隔离客户端与具体产品类的耦合
  • 具体工厂层EditorFactory
    • 负责实际对象的创建
    • 可在此处扩展对象初始化逻辑

抽象工厂的优势

场景收益
多平台兼容统一创建 Windows/Mac 风格的 UI 组件
多角色系统生成管理员/用户等不同权限体系
多数据源切换动态切换 MySQL/MongoDB 数据库操作类

适用场景

✅ 系统需要独立于对象的创建、组合方式
✅ 需要生成多个相互关联的产品族
✅ 需要提供产品的扩展性(如新增角色类型)

总结

抽象工厂模式通过分层抽象,让代码具备更强的扩展性和可维护性。当你的系统需要管理多个关联对象的创建时,不妨尝试这种「工厂的工厂」模式,让复杂对象的生成变得优雅而可控!