什么是工厂模式?
工厂模式是一种创建型设计模式,核心思想是将对象的实例化过程封装到一个函数(工厂)中,调用者无需关心对象的具体创建细节,只需通过统一接口传递参数即可获得所需对象。这种模式尤其适合以下场景:
- 对象创建逻辑复杂(如依赖不同配置)
- 需要根据不同条件生成不同对象
- 希望隔离创建逻辑与业务代码
工厂模式实战:用户权限系统
假设我们需实现一个用户权限系统,不同角色(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()
),过度使用工厂模式反而会增加代码层级。设计模式是工具,而非目标,合理选择才能发挥价值。
总结
工厂模式通过抽象化对象创建过程,让代码更灵活、更易维护。掌握其核心思想,结合实际场景合理运用,能显著提升代码质量。在你的下一个项目中,试试用它来解决对象创建复杂度吧!