享元模式

模式定义: 运用共享技术有效地支持大量细粒度的对象。
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'

 

 
posted on 2023-02-21 10:57  蔻德盈  阅读(19)  评论(0)    收藏  举报