十一、享元Flyweight(结构型)

来源:互联网 发布:无限发短信软件 编辑:程序博客网 时间:2024/05/29 14:29

享元模式可以帮助你运用共享技术有效的支持大量细粒度的对象。Flyweight是一个共享对象,它可以同时在多个场景中使用,并且在每个场景中flyweight都可以作为一个独立的对象——这点和非共享对象的实例没有区别。例如,在文本编辑器中,所有的字符都会在开始时初始化,并在全局内共享所有字符,而不是每个字符就创建对象。

Flyweight适用于有大量的对象,且这些对象可以分为外部状态和内部状态两个部分,这样就可以将内部状态分离开来,创建独立的共享对象。在使用Flyweight时,一般会使用一个FlyweightFactory来帮助用户创建和查找某个特定对象。


public interface Flyweight {public String operation();public void setLeft(Flyweight node);public void setRight(Flyweight node);public Flyweight getLeft();public Flyweight getRight();}public class ConcreteFlyweight implements Flyweight{private Flyweight intrinsicState = null;private Flyweight left = null;private Flyweight right = null;public ConcreteFlyweight(String value){intrinsicState = FlyweightFactory.getFlyweight(value);}@Overridepublic String operation() {StringBuilder ss = new StringBuilder(intrinsicState.operation());if(left != null) ss.append(left.operation());if(right != null) ss.append(right.operation());return ss.toString();}@Overridepublic void setLeft(Flyweight node) {left = node;}@Overridepublic void setRight(Flyweight node) {right = node;}@Overridepublic Flyweight getLeft() {return left;}@Overridepublic Flyweight getRight() {return right;}}public class FlyweightFactory {private static Map<String, Flyweight> pool = new HashMap<>();public static Flyweight getFlyweight(String key){if(pool.containsKey(key)){return pool.get(key);} else {Flyweight fw = new internalFlyweight(key);pool.put(key, fw);return fw;}}private static class internalFlyweight implements Flyweight{private String value = null;public internalFlyweight(String value){this.value = value;}@Overridepublic String operation() {return value;}@Overridepublic void setLeft(Flyweight node) {throw new RuntimeException("unsupport!");}@Overridepublic void setRight(Flyweight node) {throw new RuntimeException("unsupport!");}@Overridepublic Flyweight getLeft() {throw new RuntimeException("unsupport!");}@Overridepublic Flyweight getRight() {throw new RuntimeException("unsupport!");}}}public class Client {@Testpublic void test(){Flyweight root = buildTree(new String[]{"a", "b", "c","a","b","c"});System.out.println(root.operation());}//构建一棵节点树,这棵树按照广度优先,一层一层向下public Flyweight buildTree(String strs[]){return dfs(strs, 0);}private Flyweight dfs(String strs[], int index){Flyweight root = new ConcreteFlyweight(null);if(index < strs.length){root = new ConcreteFlyweight(strs[index]);}if(2*index+1 < strs.length){root.setLeft(dfs(strs, 2*index+1));}if(2*index+2 < strs.length){root.setRight(dfs(strs, 2*index+2));}return root;}}

这里将字符作为Flyweight对象,FlyweightFactory内部包含了一个所有Flyweight对象的pool,当查找Flyweight对象时,如果存在pool中,则不再创建而是直接复用,而不存在时,则需要创建。这样字符的内容作为内部状态被共享,而字符间的关系作为外部状态被额外存储在节点信息中。通过Flyweight模式可以在需要大量字符时减少存储字符所需要的空间。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 马桶下水管短了怎么办 下水管比马桶低怎么办? 寻常疣液氮冷冻后该怎么办 寻常疣冷冻后起水泡胀痛怎么办 冷冻后大水泡痒怎么办 19岁的宫颈糜烂怎么办 发面酸了没有碱怎么办 面发时间长酸了怎么办 丽珠兰打完红肿怎么办 美的冰柜冷藏室结冰怎么办 胃下午和晚上痛怎么办 二胡弓毛粗拉外弦触到里弦怎么办 电视成黑白的了怎么办 城市居民无钱入社保医保怎么办 老婆说离婚又找不到怎么办 爱一个人太累了怎么办 车凹陷漏底漆了怎么办 燕子窝掉下来了怎么办 文科没考上一本怎么办 学校午休小学孩子吵闹怎么办 老鼠死在空调里怎么办 公务员老公四十岁想辞职怎么办 打胎5次又怀孕怎么办 墙纸颜色太淡了怎么办 皮子腺囊肿有点疼痛怎么办 地板颜色选浅了怎么办 地板买的太暗了怎么办 木地板贴好后发现颜色不好看怎么办 鞋上鞋扣老是开怎么办 虚拟机的win10蓝屏重启怎么办 fs免拆模板专利怎么办 新买的床咯吱响怎么办 实木床一动就响怎么办 cad图纸是斜的怎么办 老房子土墙腻子老掉怎么办 生完孩子子宫大怎么办 刚开的店没人怎么办 刚开业的店没人怎么办 美容店没人进店怎么办 新店开业招不到营业员怎么办 无意开通了花呗怎么办?