前言:【模式总览】——————————by xingoohtml
享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减小细粒度资源的消耗。好比,一个编辑器用到大量的字母数字和符号,可是不须要每次都建立一个字母对象,只须要把它放到某个地方共享使用,单独记录每次建立的使用上下文就能够了。java
再好比餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不须要每次新来顾客,就买新的盘子餐具。缓存
1 一个系统应用到了大量的对象,并且不少都是重复的。编辑器
2 因为大量对象的使用,形成了存储效率上的开销。this
3 对象的状态大可能是外部状态,不干扰状态自己。spa
4 若是剔除这些外部状态,能够用一组小规模的对象表示共享对象。code
最近项目中就有这个使用场景,好比一些文件的图标,因为重复使用,彻底能够采用这种模式,放入缓存中,之后每次调用直接从缓存中读取就好了。htm
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 共享对象的接口,描述统一标识blog
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 *****************************************