闭包工厂函数通过外层函数捕获私有状态并返回含公有方法的对象,实现封装与实例隔离;如createcounter生成独立计数器,createuser支持配置增强,注意避免闭包内存泄漏。

用闭包实现工厂函数创建对象,核心是利用函数作用域“捕获”私有状态,返回一个带有公有方法的对象,这些方法能访问并操作闭包内的变量,从而模拟私有属性和封装。
闭包工厂函数的基本结构
工厂函数本身是一个外层函数,接收初始化参数;内部定义私有变量和方法;返回一个对象,其方法通过闭包引用这些私有数据。
- 外层函数每次调用都创建独立的作用域,保证实例间状态隔离
- 返回的对象不暴露私有变量,只暴露经过控制的接口
- 无需 new 或 class,纯函数式,轻量灵活
简单示例:计数器工厂
下面是一个典型的闭包工厂,生成带私有 count 的计数器对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createCounter(initial = 0) {
let count = initial; // 私有状态,外部不可直接访问
return {
increment() {
count++;
return count;
},
decrement() {
count--;
return count;
},
value() {
return count;
}
};
}
const counter1 = createCounter(10);
const counter2 = createCounter(100);
console.log(counter1.increment()); // 11
console.log(counter2.increment()); // 101
console.log(counter1.value()); // 11
// console.log(counter1.count); // undefined —— 真正私有
进阶用法:支持配置与方法增强
工厂函数可接收配置对象,动态决定行为,比如添加阈值限制或日志功能:
function createUser(name, config = {}) {
const { maxLoginAttempts = 3, enableLog = false } = config;
let loginAttempts = 0;
const log = (...args) => enableLog && console.log(`[User:${name}]`, ...args);
return {
getName() {
return name;
},
tryLogin() {
if (loginAttempts >= maxLoginAttempts) {
log("Login blocked: too many attempts");
return false;
}
loginAttempts++;
log("Login attempt", loginAttempts);
return true;
},
resetAttempts() {
loginAttempts = 0;
log("Attempts reset");
}
};
}
const alice = createUser("Alice", { maxLoginAttempts: 2, enableLog: true });
alice.tryLogin(); // [User:Alice] Login attempt 1
alice.tryLogin(); // [User:Alice] Login attempt 2
alice.tryLogin(); // [User:Alice] Login blocked: too many attempts
注意点与常见误区
闭包工厂虽灵活,但需注意内存和语义边界:
- 避免在闭包中意外引用大型对象(如 DOM 节点、大数组),否则可能阻碍垃圾回收
- 返回的对象方法共享同一个闭包环境,但每个工厂调用产生的闭包彼此隔离
- 不要试图用 this 指向闭包变量——this 在普通对象方法中指向该对象本身,不是外层函数作用域
- 若需继承或类型识别,可手动设置 constructor 或添加 isXXX 类型判断方法,但本质上仍是普通对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










