1 概述
定义 使用共享对象可以有效的支持大量的细粒度的对象。
享元对象的信息分为:内部状态和外部状态
内部状态:内部状态是对象可以共享出来的信息,存储在享元对象内部且不会随环境改变而改变的。
外部状态:外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可共享的,它是一批对象的统一标识,是唯一一个索引值。
flyweigh 抽象享元角色,定义出对象的外部状态和内部状态的接口或实现
concreteflyweight 具体享元角色
unshareconcreteflyweight 不可共享技术的对象,该对象一般不会出现在享元工厂中。
flyweightfactory 享元工厂 构造一个容器,同时提供获得对象的方法
代码比较简单,工厂中存储一个静态对象池子map,外部状态为key值,对象为value,有则返回,没有则新建一个存储到map中再返回。(只能从对象池中获取,不能自己创建)
2 使用场景
系统中存在大量的相似对象
细粒度的对象都具接近的外部状态,而且内部状态与环境无关,也就是对象没有特定的身份
需要缓冲池的场景
3 优缺点
3.1 优点
减少内存使用:由于享元模式共享对象,因此可以减少内存使用。
提高性能:创建和销毁对象会占用大量的CPU时间和内存空间。因此,使用享元模式可以提高性能。
代码简洁:享元模式可以使代码更简洁,因为该模式使用相同的对象来处理多个请求,而不需要创建大量的对象。
3.2 缺点
共享对象可能会对线程安全造成问题。如果不正确地实现共享机制,则可能导致多个线程对同一对象进行更改,从而导致竞争条件。
需要牺牲一定的时间和空间,来实现对象共享和控制机制。这意味着,当对象之间没有重复性时,使用享元模式可能会导致额外的开销。