十一、享元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
- 十一、享元Flyweight(结构型)
- 结构型模式:Flyweight(享元)
- 享元模式Flyweight(结构型)
- 结构型-享元模式(Flyweight)
- 结构型-享元flyweight
- 十一、结构模式之享元(Flyweight)模式
- 结构型模式之享元模式(Flyweight)
- 结构型模式-----享元模式(Flyweight)
- 设计模式--享元模式FlyWeight(结构型)
- 结构型模6:享元模式(Flyweight Pattern)
- 结构型设计模式---享元模式(Flyweight)
- 结构型模式之享元模式(FlyWeight)
- 十九、享元模式Flyweight(结构型模式)
- (结构型模式)FLYWEIGHT——享元模式
- java享元模式(Flyweight)-结构型
- 设计模式-结构型-享元模式(Flyweight)
- 结构型模式之享元模式(FlyWeight)
- 【结构型模式】flyweight(享元)
- 生活、工作点滴(一)
- Android:基于百度云推送的聊天系统
- jQuery 网络请求及 JSON 数据处理
- SublimeText的使用
- OpenCV与Linux基础知识
- 十一、享元Flyweight(结构型)
- css样式表和选择器的优先级以及position元素属性值的区别
- volatile关键字解析&内存模型&并发编程中三概念
- ACM--字母增加--HDOJ 1328--IBM Minus One--字符串
- makefile 文件中 `cat /lib/sysliblist` 意思详解
- A09_Android动画
- Red and Black hd 1312
- 把table中指定数值列的值(NUM),比方说5,转化为生产同记录的5行,方便一些打印软件使用
- LeetCode 147 Insertion Sort List