原型配合工厂模式兼顾复用性与灵活性:object.create绑定原型可共享方法且隐藏new;构造函数+工厂支持instanceof识别;动态混入则按需扩展行为。

原型对象配合工厂模式,核心是让工厂函数返回的对象能共享方法、节省内存,同时保留工厂的灵活性和封装性——不直接用 new,但又不重复创建函数实例。
为什么需要原型配合工厂模式
纯工厂函数每次返回新对象,所有方法(如 toString、getId)都独立复制一份,浪费内存;而构造函数用 prototype 可共享方法,但暴露了 new 调用和具体类型。两者结合,就能兼顾:工厂负责“决定创建什么”,原型负责“怎么高效复用行为”。
用 Object.create 绑定原型的工厂实现
这是最常用也最清晰的方式:工厂函数内部用 Object.create(Prototype) 创建实例,再填充自有属性。
- 先定义一个原型对象,把通用方法放进去
- 工厂函数用
Object.create基于该原型创建干净实例 - 在实例上设置动态属性(如
name、role),并可选择性添加实例专属逻辑
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const UserPrototype = {
toString() {
return `${this.name} (${this.role})`;
},
hasPermission(action) {
return this.permissions?.includes(action);
}
};
function createUser(name, role) {
if (!name) throw new Error('Name is required');
const user = Object.create(UserPrototype);
user.name = name;
user.role = role;
user.permissions = role === 'admin' ? ['read', 'write', 'delete'] : ['read'];
return user;
}
const admin = createUser('Alice', 'admin');
const guest = createUser('Bob', 'guest');
console.log(admin.toString()); // "Alice (admin)"
console.log(admin instanceof Object); // true(注意:不是 User 构造函数实例)
console.log(admin.hasPermission('write')); // true
用构造函数 + 工厂函数组合实现
当需要明确类型识别(比如用 instanceof 判断)时,可让工厂函数内部调用构造函数,但不对外暴露构造器本身。
- 定义私有构造函数(或模块内限定作用域),只在工厂内部使用
- 构造函数的
prototype上挂载共享方法 - 工厂函数统一入口,隐藏构造细节,支持校验、默认值、日志等增强逻辑
示例:
function User(name, role) {
this.name = name;
this.role = role;
this.id = Date.now() + Math.random();
}
User.prototype.toString = function() {
return `${this.name} (${this.role})`;
};
User.prototype.isAdmin = function() {
return this.role === 'admin';
};
// 工厂函数 —— 对外唯一创建入口
function createUser(name, role) {
if (!name) throw new Error('Name is required');
const normalizedRole = role || 'user';
return new User(name, normalizedRole);
}
const admin = createUser('Charlie', 'admin');
console.log(admin instanceof User); // true
console.log(admin.toString()); // "Charlie (admin)"
动态原型混入:按需扩展行为
工厂还可根据参数,把不同原型对象“混入”实例,实现轻量继承或角色组合,避免深继承链。
- 准备多个功能原型(如
Editable、Loggable) - 工厂函数用
Object.assign或Object.setPrototypeOf动态挂载 - 适合配置驱动场景,比如后端返回用户权限字段,前端据此混入对应能力
示例:
const Editable = {
edit(content) { this.content = content; }
};
const Loggable = {
log(msg) { console.log(`[${this.name}]: ${msg}`); }
};
function createEnhancedUser(name, features = []) {
const user = { name };
if (features.includes('edit')) Object.assign(user, Editable);
if (features.includes('log')) Object.assign(user, Loggable);
return user;
}
const editor = createEnhancedUser('Dana', ['edit', 'log']);
editor.edit('Hello');
editor.log('started editing'); // "[Dana]: started editing"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










