- 模式定义
运用共享技术有效地支持大量细粒度的对象
- 优点
如果系统有大量类似的对象,可以节省大量的内存及CPU资源
- 举例
比如说坦克大战小游戏中的墙或者草丛,每一个墙或者草丛都是一样的,如果我们大量创建对象的话内存占用不可想想。这时候就可以用到享元模式。
首先,我们来定义墙或者树,
class Tree{ private final String name; private final String data; public Tree(String name, String data) { System.out.println(name+"tree created ...."); this.name = name; this.data = data; } public String getName() { return name; } public String getData() { return data; } }
这里要是final形式的来保证我们线程安全,然后定义他的坐标:
class TreeNode{ private int x; private int y; private Tree tree; public TreeNode(int x, int y, Tree tree) { this.x = x; this.y = y; this.tree = tree; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Tree getTree() { return tree; } public void setTree(Tree tree) { this.tree = tree; } }
最后需要一个工厂方法来创建tree,这里就是运用到享元模式,我自己的理解是类似spring的一级缓存,
class TreeFactory{ private static Map<String,Tree> map = new ConcurrentHashMap<>(); public static Tree getTree(String name,String data){ if(map.containsKey(name)){ return map.get(name); } Tree tree = new Tree(name,data); map.put(name,tree); return tree; } }
好了,我们来看看测试结果:
public class FlyWeightTest { public static void main(String[] args) { TreeNode treeNode1=new TreeNode(12,23,TreeFactory.getTree("xxx","ooo")); TreeNode treeNode2=new TreeNode(24,27,TreeFactory.getTree("xxx","ooo")); } }
不管我们创建多少treeNode,只要其中的tree不变,tree都只会创建一次。
- 源码中的应用
String,Integer,Long...
com.sun.org.apache.bcel.internal.generic.InstructionConstants