工厂模式是批量创建结构一致对象的高效方式,通过函数或类封装重复构造逻辑,支持简单工厂、构造函数组合及多类型动态创建,并常与Vue、Axios等现代工具链结合实现解耦与配置统一。

工厂模式是批量创建结构一致对象的高效方式,核心在于把重复的对象构造逻辑抽离成一个可复用的函数或类,调用时只需传入差异化参数,就能得到配置好的实例。
用函数封装创建逻辑(简单工厂)
适合轻量、结构固定、无需继承扩展的场景。写一个返回对象的函数,内部统一设置属性和方法:
- 定义通用字段(如 name、age、role)和共享行为(如 sayHello、getInfo)
- 每次调用传入具体值,函数内部 new Object() 或使用字面量构造,返回新对象
- 避免手写多个相似对象字面量,消除冗余代码
示例:
function createUser(name, age, role) {
return {
name,
age,
role,
sayHello() { console.log(`Hi, I'm ${this.name}`); },
getInfo() { return `${this.name} is ${this.age} years old.`; }
};
}
const user1 = createUser("张三", 25, "admin");
const user2 = createUser("李四", 30, "user");
const user3 = createUser("王五", 28, "editor");
用构造函数 + 工厂函数组合(增强复用性)
当对象需共享原型方法(节省内存)、或未来可能扩展为类体系时,可结合构造函数与工厂函数:
- 先定义构造函数设定基础状态
- 再用工厂函数调用 new,统一初始化并返回实例
- 所有实例共享原型上的方法,而非每个对象都复制一份
示例:
function User(name, age, role) {
this.name = name;
this.age = age;
this.role = role;
}
User.prototype.sayHello = function() {
console.log(`Hello from ${this.name}`);
};
function createUserFactory(name, age, role) {
return new User(name, age, role);
}
const u1 = createUserFactory("Alice", 26, "dev");
const u2 = createUserFactory("Bob", 31, "pm");
按类型动态创建(支持多品类)
若需批量生成不同子类但结构相似的对象(如 alert、confirm、prompt 弹窗),可在工厂中加入类型判断:
- 接收 type 参数,内部 switch 或对象映射决定实例化哪一类
- 每类可有自己的默认配置和行为,但对外接口保持一致(如 show()、close())
- 客户端只关心“要什么”,不关心“怎么造”
示例(简化版):
function createDialog(type, config = {}) {
const defaults = {
confirm: { title: "确认操作", okText: "确定", cancelText: "取消" },
alert: { title: "提示", okText: "知道了" },
prompt: { title: "请输入", input: true }
};
return {
...defaults[type],
...config,
show() { console.log(`Showing ${type} dialog`); },
close() { console.log(`${type} closed`); }
};
}
const confirmDlg = createDialog("confirm", { title: "删除确认?" });
const alertDlg = createDialog("alert", { okText: "好的" });
配合现代工具链提升实用性
在真实项目中,工厂模式常与框架能力结合,进一步解耦创建逻辑:
- Vue 中的 createApp() 是典型工厂:隐藏了应用实例的完整初始化过程
- Axios 的 axios.create(config) 返回定制实例,避免污染全局配置
- 组件库中弹窗、通知等 API,本质都是工厂函数,屏蔽底层渲染细节
这类实践说明:工厂不只是“造对象”,更是控制创建边界、统一配置入口、便于测试替换的关键抽象。

















