享元模式

Posted camcay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了享元模式相关的知识,希望对你有一定的参考价值。

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

类图

技术图片

 (来源: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());
    }
}

运行结果

技术图片

 

优点

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

缺点

  • 单个逻辑实例无法拥有独立而不同的行为。

以上是关于享元模式的主要内容,如果未能解决你的问题,请参考以下文章

11-享元(Flyweight)模式Ruby实现

设计模式课程 设计模式精讲 13-1 享元模式coding

常用设计模式系列之——享元模式

23种设计模式之享元模式代码实例

享元模式

享元模式(Flyweight)