享元模式

让某个类的一个示例能用来提供多个“虚拟实例”

类图

 (来源:wiki)

示例

 

 

public class Tree {
    private String color;
    public Tree(String color){
        this.color =color;
    }

    @Override
    public String toString() {
        return color+" Tree";
    }
}

public class TreeManager {
    private static final HashMap<String,Tree> TREE_MAP = new HashMap<>();
    public static  Tree getTree(String color){
        Tree tree = (Tree)TREE_MAP.get(color);
        if(tree==null){
            tree = new Tree(color);
            TREE_MAP.put(color,tree);
        }
        System.out.println(tree);
        return  tree;
    }
    public static int countTrees(){
        return  TREE_MAP.size();
    }
}

//测试
public class Client {
    public static void main(String[] args){
        TreeManager.getTree("GREEN");
        TreeManager.getTree("GREEN");
        TreeManager.getTree("RED");
        TreeManager.getTree("GREEN");
        TreeManager.getTree("BLUE");
        TreeManager.getTree("RED");
        TreeManager.getTree("BLUE");
        System.out.println("对象个数:"+TreeManager.countTrees());
    }
}

运行结果

 

优点

  • 减少运行时对象实例个数,节约内存。

缺点

  • 单个逻辑实例无法拥有独立而不同的行为。
posted @ 2020-02-28 15:20  Camcay  阅读(93)  评论(0)    收藏  举报