努力保头发的打工人
努力保头发的打工人
发布于 2021-01-26 / 84 阅读 / 0 评论 / 0 点赞

享元模式

1 概述

定义 使用共享对象可以有效的支持大量的细粒度的对象。

享元对象的信息分为:内部状态和外部状态

  • 内部状态:内部状态是对象可以共享出来的信息,存储在享元对象内部且不会随环境改变而改变的。

  • 外部状态:外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可共享的,它是一批对象的统一标识,是唯一一个索引值。

享元模式类图.png

  • flyweigh 抽象享元角色,定义出对象的外部状态和内部状态的接口或实现

  • concreteflyweight 具体享元角色

  • unshareconcreteflyweight 不可共享技术的对象,该对象一般不会出现在享元工厂中。

  • flyweightfactory 享元工厂 构造一个容器,同时提供获得对象的方法

代码比较简单,工厂中存储一个静态对象池子map,外部状态为key值,对象为value,有则返回,没有则新建一个存储到map中再返回。(只能从对象池中获取,不能自己创建)

2 使用场景

  • 系统中存在大量的相似对象

  • 细粒度的对象都具接近的外部状态,而且内部状态与环境无关,也就是对象没有特定的身份

  • 需要缓冲池的场景

3 优缺点

3.1 优点
  • 减少内存使用:由于享元模式共享对象,因此可以减少内存使用。

  • 提高性能:创建和销毁对象会占用大量的CPU时间和内存空间。因此,使用享元模式可以提高性能。

  • 代码简洁:享元模式可以使代码更简洁,因为该模式使用相同的对象来处理多个请求,而不需要创建大量的对象。

3.2 缺点
  • 共享对象可能会对线程安全造成问题。如果不正确地实现共享机制,则可能导致多个线程对同一对象进行更改,从而导致竞争条件。

  • 需要牺牲一定的时间和空间,来实现对象共享和控制机制。这意味着,当对象之间没有重复性时,使用享元模式可能会导致额外的开销。