享元模式
模式定义: 运用共享技术有效地支持大量细粒度的对象。
import java.util.HashMap; import java.util.Map; /** * @author * @Slogan 致敬大师,致敬未来的你 */ public class FlyweithtTest { public static void main(String[] args) { //需要共享的对象 treeTypeByName TreeType treeTypeByName = TreeFactory.getTreeTypeByName("xxx", "yyyyy"); //对共享对象 treeTypeByName 的使用 TreeNode treeNode1 = new TreeNode(0, 0, treeTypeByName); TreeNode treeNode2 = new TreeNode(4, 6, treeTypeByName); } } class TreeType { private final String name; private final String data; public TreeType(String name, String data) { this.name = name; this.data = data; } public String getName() { return name; } public String getData() { return data; } } class TreeNode { private int x; private int y; private TreeType treeType; public TreeNode(int x, int y, TreeType treeType) { this.x = x; this.y = y; this.treeType = treeType; } } class TreeFactory { static Map<String, TreeType> map = new HashMap<>(); public static TreeType getTreeTypeByName(String name, String data) { if (map.containsKey(name)) { return map.get(name); } TreeType treeType = new TreeType(name, data); map.put(name, treeType); return treeType; } }
优点:如果系统有大量类似的对象,可以节省大量的内存及CPU资源JDK源码中的应用
1 String,Integer,Long...
2 com.sun.org.apache.bcel.internal.generic.InstructionConstant
验证Integer (-128~127 直接是享元模式,Long也是,String.intern()就是指向常量池中的常量,字符串常量用的就是享元模式)
public static void testFlyweight() { Integer a = 122; Integer b = 122; Integer c = 130; Integer d = 130; System.out.println(a == b); System.out.println(c == d); } 运行结果: Connected to the target VM, address: '127.0.0.1:51065', transport: 'socket' true false Disconnected from the target VM, address: '127.0.0.1:51065', transport: 'socket'
浙公网安备 33010602011771号