模式意图 享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。
再比如餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具。
应用场景 1 一个系统应用到了大量的对象,而且很多都是重复的。
2 由于大量对象的使用,造成了存储效率上的开销。
3 对象的状态大多是外部状态,不干扰状态本身。
4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。
最近项目中就有这个使用场景,比如一些文件的图标,由于重复使用,完全可以采用这种模式,放入缓存中,以后每次调用直接从缓存中读取就行了。
模式结构
FlyweightFactorty 提供共享对象的工厂方法,里面含有一个聚集对象,一般都是用HashMap。通常这个工厂类都通过单例模式创建。
1 class FlyweightFactory{
2 private HashMap map = new HashMap();
3
4 public FlyweightFactory() {
5 }
6
7 public Flyweight factory(int state){
8 if(map.containsKey(state)){
9 return (Flyweight)map.get(state);
10 }else{
11 map.put(state, new ConcreteFlyweight(state));
12 return (Flyweight)map.get(state);
13 }
14 }
15
16 public void CheckMap(){
17 System.out.println("*****************************************");
18 int i=0;
19 for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
20 Map.Entry e = (Map.Entry)it.next();
21 System.out.println("map.get("+(i++)+") : "+ e.getKey());
22 }
23 System.out.println("*****************************************");
24 }
25 }
Flyweight 共享对象的接口,描述统一标识
1 interface Flyweight{
2 public int getState();
3 }
ConcreteFlyweight 真正的具体实现类
1 class ConcreteFlyweight implements Flyweight{
2 private int state;
3 public ConcreteFlyweight(int state) {
4 this.state = state;
5 }
6 public int getState() {
7 return state;
8 }
9 }
全部代码
package com.xingoo.Flyweight;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
class FlyweightFactory{
private HashMap map = new HashMap();
public FlyweightFactory() {
}
public Flyweight factory(int state){
if(map.containsKey(state)){
return (Flyweight)map.get(state);
}else{
map.put(state, new ConcreteFlyweight(state));
return (Flyweight)map.get(state);
}
}
public void CheckMap(){
System.out.println("*****************************************");
int i=0;
for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
Map.Entry e = (Map.Entry)it.next();
System.out.println("map.get("+(i++)+") : "+ e.getKey());
}
System.out.println("*****************************************");
}
}
interface Flyweight{
public int getState();
}
class ConcreteFlyweight implements Flyweight{
private int state;
public ConcreteFlyweight(int state) {
this.state = state;
}
public int getState() {
return state;
}
}
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
factory.factory(4);
factory.factory(2);
factory.factory(2);
factory.factory(1);
factory.factory(1);
factory.factory(3);
factory.CheckMap();
}
}
运行结果
*****************************************
map.get(0) : 1
map.get(1) : 2
map.get(2) : 3
map.get(3) : 4
*****************************************