工厂模式是通过专门函数或类封装对象创建过程的设计模式,JavaScript中常用于根据条件生成不同对象。例如用户工厂根据类型创建VIP、管理员或普通用户对象,实现创建与使用的解耦。简单工厂用条件逻辑返回实例,工厂方法则通过抽象类扩展,如产品工厂创建手机或笔记本实例,符合开闭原则。应用场景包括表单验证、UI组件初始化、API客户端选择和日志记录器等,提升代码可维护性和扩展性。

工厂模式是一种创建型设计模式,它的核心作用是将对象的创建过程封装起来,让调用者无需关心具体的实现类。在JavaScript中,由于其动态和灵活的特性,工厂模式应用非常广泛,尤其适合处理需要根据条件创建不同对象的场景。
什么是工厂模式
工厂模式通过一个专门的函数或类来创建对象,而不是直接使用 new 操作符。这个“工厂”函数会根据传入的参数决定实例化哪一个类或返回哪一种对象。
这样做的好处是:解耦对象的创建与使用,提高代码的可维护性和扩展性。
简单工厂模式示例
假设我们有一个需求:根据不同用户类型(普通用户、会员用户、管理员)创建对应的用户对象。
立即学习“Java免费学习笔记(深入)”;
代码实现:
function UserFactory(type, name) {
let user;
if (type === 'vip') {
user = { role: 'VIP用户', name, discount: 0.8 };
} else if (type === 'admin') {
user = { role: '管理员', name, accessLevel: 10 };
} else {
user = { role: '普通用户', name, discount: 1.0 };
}
return user;
}
const vipUser = UserFactory('vip', '张三');
console.log(vipUser); // { role: 'VIP用户', name: '张三', discount: 0.8 }
这种方式让调用者只需传入类型和名称,就能获得正确的用户对象,无需了解内部逻辑。
工厂方法模式进阶
当业务变复杂时,可以将工厂本身也抽象出来,每个子类负责创建特定类型的对象。这更符合开闭原则(对扩展开放,对修改关闭)。
例如:定义一个基础工厂类,再由具体工厂创建具体产品。
代码示例:
class Product { }
class Phone extends Product {
getName() { return '手机'; }
}
class Laptop extends Product {
getName() { return '笔记本'; }
}
class ProductFactory {
create(type) {
if (type === 'phone') return new Phone();
if (type === 'laptop') return new Laptop();
throw new Error('不支持的产品类型');
}
}
const factory = new ProductFactory();
const phone = factory.create('phone');
console.log(phone.getName()); // 手机
这种结构便于后期添加新产品,只要扩展 create 方法即可,原有代码不受影响。
实际应用场景
工厂模式常用于以下情况:
- 表单验证规则生成:根据字段类型(邮箱、手机号、密码)返回不同的验证器
- UI组件初始化:页面根据配置项自动创建按钮、输入框等组件
- API客户端选择:根据环境(开发/生产)创建不同的请求服务实例
- 日志记录器:按级别或输出目标(控制台、文件、远程)生成对应记录器
基本上就这些。工厂模式不复杂但容易忽略,合理使用能让代码更清晰、更易扩展。特别是在项目规模变大后,它的价值会更加明显。










