享元模式

2024-05-02 05:35

1. 享元模式

面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。
  
 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
  
 享元模式包含如下角色:
                                                                                  
 运行结果:
                                          
 享元模式是一个考虑系统性能的设计模式,通过使用享元模式可以节约内存空间,提高系统的性能。
  
 享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
  
 享元模式以共享的方式高效地支持大量的细粒度对象,享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。
  
 享元模式的优点
  
 享元模式的缺点
  
 在以下情况下可以使用享元模式:
  
 享元模式在编辑器软件中大量使用,如在一个文档中多次出现相同的图片,则只需要创建一个图片对象,通过在应用程序中设置该图片出现的位置,可以实现该图片在不同地方多次重复显示。
  
 单纯享元模式和复合享元模式
  
 享元模式与其他模式的联用
  
 摘自: https://www.doudianyun.com/2020/06/%E7%BB%93%E6%9E%84%E5%9E%8Bc-5-%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/

享元模式

2. 什么是享元模式?

    享元模式主要是为了解决大量对象创建后,增大了系统的资源开销,为了解决此问题,该模式通过共享对象的方式实现。
  
     接下来,以一个实际例子来简单介绍下享元模式,假设有这么一个场景有两个用户服务类,分别是普通用户服务与VIP用户服务,其中有个Operation操作,而该操作主要是为了完成用户注册过程,在注册过程中,需要通过调用短信接口来完成注册流程;这时两个用户服务都需要一个HTTP连接池来完成此功能;如果每个类都单独创建一个HTTP连接池,那么系统将会产生两份资源开销,而其利用率将会很低;
  
     为此,通过如下图例中的设计方式,将HTTP连接池的在用户服务工厂中进行创建,通过抽象工厂模式建立多种不同的用户服务子类实现,并将HTTP连接池在子类实例间进行共享,实现降低资源开销,提升连接池的资源利用率。