享元模式

99 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

享元模式

享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

使用场景

1、底层开发 :  某个系统的底层开发 , 对性能要求比较高 , 可使用享元模式 ;

2、缓冲池 :  系统中实例对象数量庞大 , 需要缓冲池处理这些对象 ;

代码演示


public class FlyWeightTest {

    public static void main(String[] args) {

        TreeNode treeNode1=new TreeNode( 3,4, TreeFactory.getTree("xxx","xxxxxxx xx" ));

        TreeNode treeNode2=new TreeNode( 5,4, TreeFactory.getTree("xxx","xxxxxxx xx" ));

        TreeNode treeNode3=new TreeNode( 13,24, TreeFactory.getTree("yyy","xxxxx xxxx" ));

        TreeNode treeNode4=new TreeNode( 15,24, TreeFactory.getTree("yyy","xxxxx xxxx" ));
    }

}


class TreeNode{

    private int x;

    private int y;

    private Tree tree;

    public TreeNode(int x, int y, Tree tree) {

        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 TreeFactory{

    private static Map<String,Tree> map=new ConcurrentHashMap<>( );

    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;

    }

}


class Tree{

    private final String name;

    private final String data;

    public Tree(String name, String data) {

        System.out.println(" name: "+name +" tree created. ");

        this.name=name;

        this.data=data;

    }

    public String getName() {

        return name;

    }

    public String getData() {

        return data;

    }

}

优缺点

优点:

大大减少对象的创建,降低系统的内存,使重复利用率提高,减少对象数量从而改善应用所需的对象结构的方式。

缺点:

虽然降低内存的使用,但是性能方面增加消耗,因为增加了哈希表添加,查询等操作。还有创建的对象状态会变化时就不能使用。比如很多玩家喜欢玩剑客,剑客这个角色开始的状态是一样的,但是玩家们让角色穿戴不同装备等等一系列操作就发生了变化。

JDK源码中的应用:

1 String,Integer,Long...

2 com.sun.org.apache.bcel.internal.generic.InstructionConstants

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。