Skip to content

享元模式Flyweight Pattern)是一种结构型设计模式,用于减少内存消耗,通过共享相似对象来提高性能。

享元模式的核心思想是将相同或相似的对象尽量复用,而不是为每个对象单独创建新实例。这种模式特别适用于需要创建大量相似对象的场景。

  • 享元(Flyweight):定义享元对象的接口,包含外部状态(不共享)和内部状态(共享)。
  • 具体享元(Concrete Flyweight):实现享元接口,定义可以共享的内部状态。
  • 非享元(Unshared Concrete Flyweight):并不共享的对象,但可以与享元对象一起工作。
  • 享元工厂(Flyweight Factory):管理和维护享元对象的缓存,确保享元对象的唯一性和复用。
  • 客户端(Client):负责使用享元对象,并将外部状态传递给享元对象。
js
// 享元类
class Shape {
  constructor(color) {
    this.color = color  // 内部状态(共享)
  }

  draw(x, y) {  // 外部状态(不共享)
    console.log(`Drawing a ${this.color} shape at (${x}, ${y})`)
  }
}

// 享元工厂类
class ShapeFactory {
  constructor() {
    this.shapes = {}
  }

  getShape(color) {
    if (!this.shapes[color]) {
      this.shapes[color] = new Shape(color)
    }
    return this.shapes[color]
  }

  getShapeCount() {
    return Object.keys(this.shapes).length
  }
}

// 客户端使用
const factory = new ShapeFactory()

// 生成形状并传递外部状态
const redShape1 = factory.getShape('red')
redShape1.draw(10, 20)

const redShape2 = factory.getShape('red')
redShape2.draw(30, 40)

const blueShape = factory.getShape('blue')
blueShape.draw(50, 60)

console.log(`Total unique shapes created: ${factory.getShapeCount()}`)
// Output:
// Drawing a red shape at (10, 20)
// Drawing a red shape at (30, 40)
// Drawing a blue shape at (50, 60)
// Total unique shapes created: 2