实现代码
// 定义策略接口
interface GeneratorStrategy {
generate(): number;
}
// 随机数生成策略
class RandomStrategy implements GeneratorStrategy {
generate(): number {
return Math.random();
}
}
// 斐波那契数列生成策略
class FibonacciStrategy implements GeneratorStrategy {
private a = 0;
private b = 1;
generate(): number {
const next = this.a + this.b;
this.a = this.b;
this.b = next;
return this.a;
}
}
// 生成器类
class ComplexGenerator {
private strategy: GeneratorStrategy;
constructor(strategy: GeneratorStrategy) {
this.strategy = strategy;
}
*generateSequence(count: number) {
for (let i = 0; i < count; i++) {
yield this.strategy.generate();
}
}
}
// 使用示例
const randomGenerator = new ComplexGenerator(new RandomStrategy());
const randomSequence = randomGenerator.generateSequence(5);
for (const value of randomSequence) {
console.log(value);
}
const fibonacciGenerator = new ComplexGenerator(new FibonacciStrategy());
const fibonacciSequence = fibonacciGenerator.generateSequence(10);
for (const value of fibonacciSequence) {
console.log(value);
}
优化思路
- 避免内存泄漏:
- 使用生成器函数
*generateSequence
,它不会一次性生成所有数据,而是按需生成。这样在处理大量数据时,不会将所有数据都存储在内存中,从而避免因数据量过大导致的内存泄漏。
- 在策略类(如
RandomStrategy
和 FibonacciStrategy
)中,确保没有引用不必要的外部对象,避免形成无法释放的引用链。如果有需要清理的资源,可在生成器结束时(例如通过 return
语句)进行清理操作。
- 提高生成效率:
- 在
FibonacciStrategy
中,使用简单的变量 a
和 b
来存储前两个斐波那契数,避免了递归调用带来的栈开销,从而提高了计算效率。
- 对于随机数生成,
Math.random()
本身是高效的,但如果有更特定的随机数需求(如指定范围),可以优化生成逻辑。
- 生成器函数
generateSequence
使用 yield
关键字逐个返回数据,而不是一次性生成整个数组,减少了中间数据存储的开销,提高了生成效率。