什么是抽象工厂模式?
抽象工厂模式是创建型设计模式的进阶形态,其核心是
- 不直接创建具体对象,而是定义产品族的创建规范
- 隔离具体类,客户端只需面向抽象接口编程
- 更适合需要统一创建多个关联对象的场景
抽象工厂实战:用户权限系统
以下是通过 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 数据库操作类 |
适用场景
✅ 系统需要独立于对象的创建、组合方式
✅ 需要生成多个相互关联的产品族
✅ 需要提供产品的扩展性(如新增角色类型)
总结
抽象工厂模式通过分层抽象,让代码具备更强的扩展性和可维护性。当你的系统需要管理多个关联对象的创建时,不妨尝试这种「工厂的工厂」模式,让复杂对象的生成变得优雅而可控!