享元设计模式
-
简单介绍
享元模式是一种创建型设计模式。该模式旨在将对象的粒度细分,通过某种共享方式,将创建完成的对象重复利用。以此来降低创建对象时的开销,一定程度上也能节省内存资源。
-
使用场景
程序中使用了大量相同类型的对象,这些对象在在创建时耗资源,并且占用空间较大,此种情况可以考虑使用享元模式。其次,当一个对象的大部分属性可以转换成外部状态属性,那么可以将外部状态属性抽取出来,通过传参的方式注入。将其余不可变属性作为内部状态封装到对象中,作为享元类,供程序共享使用。
-
场景举例
从数据库连接池中获取数据库连接对象实例的方式,是典型的享元设计思想。数据库连接实例对象,在用完之后,可以放回“池”中(并不会进行销毁操作),等下个对象需要时,从“池”中获取,达到共享的效果,从而减少创建数据库连接所需要的开销。
-
UML类图
-
具体实现
-
描述
- 以共享单车的运营模式来解释享元模式,其共性在于同一辆单车可供多个用户使用
- AbstractSharedGoods:共享商品抽象类(抽象享元类),通过lease()租赁方法在传入外部状态,其中外部状态为该单车当前租户
- SharedBicycle:共享单车(具体享元类),其内部状态是单车颜色(小黄车,小蓝车)
- User:单车租借用户(享元类的外部状态)
-
实现代码
AbstractSharedGoods.java
/** * 角色:Flyweight * 共享商品,即共享单车的抽象父类,外部状态为租用共享商品的用户 */ public abstract class AbstractSharedGoods { /** * 共享单车租赁 * @param user 租借共享单车的用户(外部状态) */ public abstract void lease(User user); }
SharedBicycle.java
/** * 角色:具体享元类(ConcreteFlyweight) * 共享单车,不同的用户可以在共享使用同一辆单车 */ public class SharedBicycle extends AbstractSharedGoods { /** * 享元类的内部状态,即共享单车颜色 * 对于同一辆单车来说其颜色是不会发生变化的 * 内部状态不会随使用者的变化而变化 * 常量,通过构造方法传入,实例化后,不在改变 */ private final String color; /** * 外部状态,不同的用户租借时,状态不同 */ private User user; @Override public void lease(User user) { this.user = user; } public SharedBicycle(String color<
-