工厂模式默认不共享方法,因每次调用均创建新函数副本;可通过 object.setprototypeof() 或 object.create() 将对象原型指向共享行为模板,使方法复用且实例属性独立。

工厂模式本身不依赖构造函数,但可以通过显式设置原型对象,让所有工厂产出的对象共享公共行为。关键不是“自动链接”,而是手动把对象的 __proto__ 指向一个统一的原型对象,或用 Object.setPrototypeOf() 建立委托关系。
为什么工厂模式默认不共享方法
普通工厂函数返回的是普通对象,比如:
function createButton(label) {
return { label, click() { console.log(label + ' clicked'); } };
}
每次调用都新建一个 click 函数,内存中存在多份副本,无法通过引用相等判断(btn1.click === btn2.click 为 false)。
用 prototype 对象实现统一行为共享
可以预先定义一个“行为模板”对象,再让每个工厂产出的对象继承它:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 创建共享原型: const buttonProto = {
click() { console.log(this.label + ' clicked'); },
disable() { this.disabled = true; }
}; - 在工厂中设置原型: function createButton(label) {
const obj = { label };
Object.setPrototypeOf(obj, buttonProto);
return obj;
} - 验证共享: const b1 = createButton('Save');
const b2 = createButton('Cancel');
console.log(b1.click === b2.click); // true
更简洁的写法:用 Object.create()
Object.create(proto) 是专为此场景设计的工具,它直接返回一个以 proto 为原型的新对象:
const buttonProto = {
click() { console.log(this.label + ' clicked'); }
};
function createButton(label) {
const obj = Object.create(buttonProto);
obj.label = label;
return obj;
}
这样既避免了手动设 __proto__,又确保所有实例共享同一份方法,且属性查找走标准原型链。
注意实例专属数据不能放原型上
如果在 buttonProto 上直接写 disabled: false,那所有按钮会共用这个布尔值——改一个就全变。正确做法是:
- 状态类属性(如 disabled、label)必须挂到实例自身:obj.disabled = false;
- 只把不变的行为(方法)、不可变配置(如 defaultTimeout: 3000)放在原型上
- 若需共享可变状态(如全局计数器),应明确设计为静态属性,例如 buttonProto.clickCount = 0;,并在方法中操作它
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










