赞
踩
享元模式
(Flyweight Pattern)是一种用于效率和内存优化的结构型设计模式
。这种模式通过共享尽可能多的相似对象来减少内存使用,特别适合于处理大量对象时,每个对象都消耗大量内存的场景
。
享元模式的核心在于分离变与不变。它将对象信息分为两个部分:
内部状态
(Intrinsic State):不依赖于场景,且不会改变的数据。外部状态
(Extrinsic State):依赖于场景,并且会改变的数据。内部状态存储在享元对象内部,通常不会改变,而外部状态则可以从外部传入享元对象来改变其行为。通过这种方式,可以使用相对较少的共享对象来替代大量的对象
。
假设我们正在开发一个游戏,其中有成千上万的树木。每棵树都有其位置、形状和颜色等属性。其中,形状和颜色是内部状态,因为它们在多个树之间可以共享。位置是外部状态,每棵树的位置都是独特的。
首先定义树的享元对象
:
// 享元对象 class TreeType { constructor(name, color, texture) { this.name = name; this.color = color; this.texture = texture; } display(location) { console.log(`Displaying a ${this.color} ${this.name} at ${location.x}, ${location.y}`); } } // 享元工厂 class TreeFactory { static treeTypes = new Map(); static getTreeType(name, color, texture) { const key = `${name}_${color}_${texture}`; if (!this.treeTypes.has(key)) { this.treeTypes.set(key, new TreeType(name, color, texture)); console.log('Creating a new TreeType object'); } return this.treeTypes.get(key); } }
然后是管理树木的类,它使用享元对象:
class Tree { constructor(x, y, treeType) { this.x = x; this.y = y; this.treeType = treeType; } display() { this.treeType.display({ x: this.x, y: this.y }); } } class Forest { constructor() { this.trees = []; } plantTree(x, y, name, color, texture) { const type = TreeFactory.getTreeType(name, color, texture); const tree = new Tree(x, y, type); this.trees.push(tree); } displayForest() { this.trees.forEach(tree => tree.display()); } }
使用这些类:
const forest = new Forest();
forest.plantTree(1, 2, 'Maple', 'Red', 'Smooth');
forest.plantTree(5, 3, 'Maple', 'Red', 'Smooth');
forest.plantTree(8, 2, 'Oak', 'Green', 'Rough');
forest.displayForest();
总的来说,享元模式在处理大量相似对象时提供了一种有效的内存优化策略。
然而,它的使用应当谨慎,需要正确评估和设计内部状态和外部状态,
以确保不会对应用程序的逻辑造成负面影响。在 JavaScript 等动态语言中,享元模式可以帮助管理内存消耗,尤其是在客户端浏览器环境中,这对提升用户体验和应用性能都是非常有益的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。