享元模式和组合模式
目录
1、享元模式
1.1 什么是享元模式
享元模式就是将系统中细粒度的相同的或者相似的对象以共享的方式存放在享元池中供客户端使用。
运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。享元模式结构较为复杂,一般结合工厂模式一起使用。
1.2 结构图
- 享元模式共分为四种角色:
- Flyweight(抽象享元类):通常是一个接口或者是抽象类,在抽象享元类中声明了共享享元类的公共方法,通过这些方法可以访问享元类的内部数据(内部状态),也可以设置享元类的外部数据(外部状态)
- Concrete Flyweight(共享具体享元类):实现抽象享元类,其实例称为享元对象,一般为单例模式,提供唯一的享元对象
- UnsharedConcrete Flyweight(非共享具体享元类):实现抽象享元类,但是不共享,通过构造函数进行实例化
- Flyweight Factory(享元工厂类):创建并管理享元对象,以内部的键值对结构存储享元对象
- 共享具体享元类与非共享具体享元类实现抽象享元类,能够保证他们对外具有一致的行为接口,为客户端的使用提供了便利,客户端通过享元工厂类获取共享享元对象。
- 享元工厂类返回的享元对象都是只有内部状态的享元对象,通过客户端操作添加外部状态
在享元模式中引入了享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,当用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
典型的享元工厂类的代码如下:
class FlyweightFactory { //定义一个HashMap用于存储享元对象,实现享元池 private HashMap flyweights = newHashMap(); public Flyweight getFlyweight(String key){ //如果对象存在,则直接从享元池获取 if(flyweights.containsKey(key)){ return(Flyweight)flyweights.get(key); } //如果对象不存在,先创建一个新的对象添加到享元池中,然后返回 else { Flyweight fw = newConcreteFlyweight(); flyweights.put(key,fw); return fw; } } }
享元类的设计是享元模式的要点之一,在享元类中要将内部状态和外部状态分开处理,通常将内部状态作为享元类的成员变量,而外部状态通过注入的方式添加到享元类中。
典型的享元类代码如下所示:
class Flyweight { //内部状态intrinsicState作为成员变量,同一个享元对象其内部状态是一致的 private String intrinsicState; public Flyweight(String intrinsicState) { this.intrinsicState=intrinsicState; } //外部状态extrinsicState在使用时由外部设置,不保存在享元对象中,即使是同一个对象 public void operation(String extrinsicState) { //...... } }