工厂模式通过函数统一创建对象,解耦“怎么创建”与“创建什么”,支持简单对象封装、构造函数复用及参数化配置,适用于逻辑复杂、类型多变或需动态实例化的场景。

工厂模式通过一个函数(或方法)统一创建对象,避免直接用 new 调用构造函数,把“怎么创建”和“创建什么”解耦。它不暴露具体类,只返回符合接口的对象,适合创建逻辑复杂、类型多变或需动态决定实例的场景。
基础工厂函数:封装简单对象创建
最常见的是用普通函数返回新对象,隐藏内部结构:
function createUser(name, role) {
// 可加入校验、默认值、日志等逻辑
if (!name) throw new Error('Name is required');
return {
name,
role,
getId() { return Date.now() + Math.random(); },
toString() { return `${this.name} (${this.role})`; }
};
}
const admin = createUser('Alice', 'admin');
const guest = createUser('Bob', 'guest');
优点是轻量、易测试、无需 new;缺点是每次返回新对象,方法无法复用(每个实例都有一份 toString 函数)。
构造函数 + 工厂函数:兼顾复用与封装
结合原型链提升性能,工厂函数只负责“组装”和“决策”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class User {
constructor(name, role) {
this.name = name;
this.role = role;
}
toString() { return `${this.name} (${this.role})`; }
}
class Admin extends User {
constructor(name) {
super(name, 'admin');
this.permissions = ['read', 'write', 'delete'];
}
}
class Guest extends User {
constructor(name) {
super(name, 'guest');
this.permissions = ['read'];
}
}
// 工厂函数:根据条件返回不同实例
function createUserFactory(name, role) {
switch (role.toLowerCase()) {
case 'admin': return new Admin(name);
case 'guest': return new Guest(name);
default: return new User(name, role);
}
}
const user = createUserFactory('Charlie', 'admin'); // 返回 Admin 实例
- 实例共享原型方法,节省内存
- 工厂可集中处理初始化逻辑(如权限预加载、配置合并)
- 调用方完全不知道
Admin或Guest类的存在
参数化工厂:支持配置驱动的对象生成
当创建逻辑依赖外部配置时,先定义工厂生成器,再产出具体工厂:
function createHttpClientFactory(config) {
const { baseUrl = '', timeout = 5000, headers = {} } = config;
return function(url, method = 'GET') {
return {
url: new URL(url, baseUrl).href,
method,
timeout,
headers: { ...headers, 'Content-Type': 'application/json' },
send() {
console.log(`Sending ${method} to ${this.url}`);
// 实际请求逻辑...
}
};
};
}
// 使用
const apiClient = createHttpClientFactory({ baseUrl: 'https://api.example.com' });
const getUser = apiClient('/users/123', 'GET');
const updateUser = apiClient('/users/123', 'PUT');
这种写法让工厂本身可配置、可复用,适合 SDK、插件系统等需要定制化行为的场景。
注意点:别为了模式而模式
工厂模式不是银弹。以下情况建议慎用或换方案:
- 对象结构极其简单,且无差异化逻辑 → 直接字面量或构造函数更清晰
- 需要严格类型约束(如 TypeScript)→ 配合泛型工厂函数,但要确保返回类型可推导
- 后续可能需继承或扩展创建流程 → 考虑抽象工厂或建造者模式
- 过度封装导致调试困难 → 工厂内部应保持透明,比如加注释说明分支依据
核心是让创建逻辑集中、可维护、易替换,而不是堆砌设计模式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










