0
点赞
收藏
分享

微信扫一扫

WPS快速将插入Excle数据插入Word

上善若水的道 04-11 12:00 阅读 0

享元模式概述

  • 享元模式(Flyweight Pattern)是一种用于优化性能的结构型设计模式,它通过共享对象来减少内存中对象的数量
  • 享元模式通常用于当系统中存在大量相同或相似对象时,通过共享这些对象的状态来减少内存消耗
  • 我们会充分利用类型系统的优势来确保内部分享状态和外部状态的有效区分

享元模式示例

// 定义享元接口,这里抽象出所有共享对象共有的内部状态属性
interface Flyweight {
  intrinsicState: string; // 内部状态,不可变,可以被共享
  operation(exteriorState: any): void; // 外部状态作为方法参数传入
}

// 具体享元类,实现了Flyweight接口
class ConcreteFlyweight implements Flyweight {
  constructor(private readonly uniqueId: number) {
    this.intrinsicState = `Internal state for object ${uniqueId}`;
  }

  getIntrinsicState(): string {
    return this.intrinsicState;
  }

  operation(exteriorState: any): void {
    console.log(`Executing operation with internal state: ${this.intrinsicState} and external state: ${exteriorState}`);
  }
}

// 享元工厂类,负责创建并管理享元对象
class FlyweightFactory {
  private flyweights: Map<string | number, Flyweight> = new Map();

  getFlyweight(uniqueId: number): Flyweight {
    let flyweight = this.flyweights.get(uniqueId);

    if (!flyweight) {
      flyweight = new ConcreteFlyweight(uniqueId);
      this.flyweights.set(uniqueId, flyweight);
    }

    return flyweight;
  }
}

// 使用示例
const factory = new FlyweightFactory();

const context1 = 1;
const context2 = 2;

const flyweight1 = factory.getFlyweight(context1);
const flyweight2 = factory.getFlyweight(context2);

// 当上下文状态不同但内部状态相同的对象请求时,会复用已存在的享元对象
flyweight1.operation("External state A");
flyweight2.operation("External state B");

// 如果context1再次请求,不会新建对象
const flyweight3 = factory.getFlyweight(context1);
flyweight3.operation("External state C");

console.log(flyweight1 === flyweight3); // 输出:true,证明指向同一享元对象
  • 这个使用Typescript来实现的示例
  • 在这个例子中,ConcreteFlyweight 类代表具体的享元对象
  • 它包含了内部状态(在这里是唯一标识符)
  • Flyweight 接口定义了享元对象的操作方法,其中外部状态作为参数传递
  • FlyweightFactory 类作为一个工厂,它维护了一个享元对象的缓存池(Map)
  • 当请求一个新对象时,如果该内部状态的对象已经存在,则直接返回现有对象,否则创建新的对象并加入缓存池中
  • 这样,对于具有相同内部状态的不同外部状态请求,系统能够有效降低对象的数量,从而节约内存和提高性能

享元模式的应用场景

  • 享元模式是一种结构型设计模式,主要用于减少内存中对象的数量,从而优化系统性能。它通过共享对象的状态来实现这一目标
  • 以下是享元模式的主要应用场景

1 )系统中存在大量相似对象

  • 当系统中存在大量相似对象,且这些对象的某些部分状态可以共享时,可以使用享元模式
  • 通过共享这些状态,可以大幅度减少需要创建的对象数量,避免大量相似对象的开销,从而提高系统资源的利用率
  • 例如,在游戏开发中,棋子、角色等对象常常具有相似的属性和状态,使用享元模式可以有效地减少内存占用并提高性能

2 )对象的创建和销毁成本较高

  • 如果对象的创建和销毁需要消耗大量的资源,或者对象的初始化过程非常复杂,那么使用享元模式可以减少资源的消耗
  • 通过复用已有的对象,可以避免频繁地创建和销毁对象,从而降低系统的开销

3 )状态可以分为内部状态和外部状态

  • 享元模式要求将对象的状态分为内部状态和外部状态
  • 内部状态是对象不可变的共享部分,而外部状态是可以改变的独立部分
  • 当多个客户端请求同一个享元对象时,它们实际上共享的是同一个对象的内部状态,而外部状态则可以根据需要进行调整
  • 这种分离使得对象的复用更加灵活和高效

4 )需要精细控制对象共享

  • 在某些情况下,需要对对象的共享进行精细化控制
  • 通过享元工厂来管理享元对象的创建和共享,可以确保对象的共享是有序和可控的
  • 享元工厂可以维护一个对象池,根据需要提供共享对象,避免无限制地创建新对象

5 ) 其他

  • 除了上述场景外,享元模式还常常应用于系统底层的开发,如数据库连接池、字符串池等
  • 在这些场景中,通过复用已有的连接或字符串对象,可以减少资源的消耗并提高系统的性能

6 )总结

  • 总的来说,享元模式适用于那些需要优化内存使用、减少对象创建和销毁成本、以及需要精细控制对象共享的场景
  • 通过共享对象状态,享元模式可以有效地提高系统的性能和资源利用率
  • 但需要注意的是,享元模式可能会增加代码的复杂性,因此在应用时需要权衡其优缺点,并根据具体需求进行决策
举报

相关推荐

0 条评论