Java设计模式–享元模式
-
定义
运用共享技术有效地支持大量细粒度对象 -
实现
import java.util.HashMap;
import java.util.Map;
public class FlyWeightTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode treeNode1=new TreeNode(3, 4, TreeFactory.getTree("xxxx", "xxxxxxxx"));
TreeNode treeNode2=new TreeNode(5, 4, TreeFactory.getTree("xxxx", "xxxxxxxx"));
System.out.println("--------------------------------------------------------");
TreeNode treeNode3=new TreeNode(6, 6, TreeFactory.getTree("yyyy", "yyyyyyyy"));
TreeNode treeNode4=new TreeNode(2, 6, TreeFactory.getTree("yyyy", "yyyyyyyy"));
}
}
class TreeNode{
private int x;
private int y;
private Tree tree;
public TreeNode(int x, int y, Tree tree) {
super();
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;
}
}
class Tree{
private final String name;
private final String data;
public Tree(String name, String data) {
super();
System.out.println("name:"+name+" "+"data:"+data);
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public String getData() {
return data;
}
}
class TreeFactory{
private static Map<String, Tree> map=new HashMap<String, Tree>();
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;
}
}
由此看出,当我们去创建相同的对象的时候,我们不会再次去实例化对象,只有在我们创建其他对象的时候,才会重新创建对象,在一定程度上避免了不必要的浪费,从而节约了内存。
-
优点
如果系统有大量类似的现象,可以节省大量的内存以及cpu资源 -
JDK源码的应用
-
String,Integer,Long.... com.sun.org.apache.bcel.internal.generic.InstructionConstants