Java 设计模式系列(十一)享元模式
Flyweight 享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。java
1、享元模式的结构
享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最多见、最直观的就是内存的损耗。享元对象能作到共享的关键是区份内部状态(Internal State)和外部状态(External State)。设计模式
一个内部状态是存储在享元对象内部的,而且是不会随环境的改变而有所不一样。所以,一个享元能够具备内蕴状态并能够共享。缓存
一个外部状态是随环境的改变而改变的、不能够共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被建立以后,在须要使用的时候再传入到享元对象内部。外蕴状态不能够影响享元对象的内部状态,它们是相互独立的。this
-
Flyweight
:享元接口,经过这个接口 flyweight 能够接受并做用于外部状态。经过这个接口传入外部的状态,在享元对象的方法处理中可能会使用这些外部的数据。spa -
ConcreteFlyweight
:具体的享元实现对象,必须是可共享的,须要封装 flyweight 的内部状态。设计 -
FlyweightFactory
:享元工厂,主要用来建立并管理共享的享元对象,并对外提供访问共享享元的接口。code
源代码
(1) Flyweight对象
/*** * 享元接口,经过这个接口享元能够接受并做用于外部状态 */ public interface Flyweight { /** 示例操做,传入外部状态 */ public void operation(String extrinsicState); } public class ConcreteFlyweight implements Flyweight{ /** 示例,描述内部状态 */ private String intrinsicState; /** 构造方法,传入享元对象的内部状态的数据 */ public ConcreteFlyweight(String state){ this.intrinsicState = state; } public void operation(String extrinsicState) { //具体的功能处理,可能会用到享元内部、外部的状态 } }
(2) FlyweightFactoryblog
/** * 享元工厂,说白了就是一个缓存 */ public class FlyweightFactory { /** 缓存多个flyweight对象,这里只是示意一下 */ private Map<String, Flyweight> fsMap = new HashMap<String,Flyweight>(); /** 获取key对应的享元对象 */ public Flyweight getFlyweight(String key) { //这个方法里面基本的实现步骤以下: //1:先从缓存里面查找,是否存在key对应的Flyweight对象 Flyweight f = fsMap.get(key); //2:若是存在,就返回相对应的Flyweight对象 if(f == null){ //3:若是不存在 //3.1:建立一个新的Flyweight对象 f = new ConcreteFlyweight(key); //3.2:把这个新的Flyweight对象添加到缓存里面 fsMap.put(key, f); //3.3:而后返回这个新的Flyweight对象 } return f; } }
2、总结
(1) 享元模式的优缺点
享元模式的优势在于它大幅度地下降内存中对象的数量。可是,它作到这一点所付出的代价也是很高的:接口
-
享元模式使得系统更加复杂。为了使对象能够共享,须要将一些状态外部化,这使得程序的逻辑复杂化。
-
享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
天天用心记录一点点。内容也许不重要,但习惯很重要!