12.设计模式-享元模式

<font color=#999AAA 享元模式,实际上在java里面主要是做缓存。比如我们常见的常量缓存池这种。因为对于java来说,对象是比较占用空间的。而我们实际上很多时候是不需要这么多对象,那么怎么办呢,就用到了享元模式。就是把公共的一些东西缓存起来。下面看代码怎么实现,写的比较简单。

实体类

public class Share {
    private String name;
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

对象共享池

public class SharePool {
    private Map<String,Share> shareMap = new ConcurrentHashMap<>();
    public Share setShare(String key) {
        if(shareMap.get(key)==null){
	        Share share = new Share();
            shareMap.put(key, share);
        }
        return shareMap.get(key);
    }
}

测试

public class FlyweightTest {
    public static void main(String[] args) {
        SharePool sharePool = new SharePool();
        Share share1 = sharePool.setShare("法师");
        share1.setId("1");
        share1.setName("流浪法师");

        Share share2 = sharePool.setShare("法师");
        share2.setId("2");
        share2.setName("辛德拉");

        Share share3 = sharePool.setShare("刺客");
        share3.setId("3");
        share3.setName("劫");

        System.out.println(share1);
        System.out.println(share2);
        System.out.println(share3);
    }
}

结果

我们会发现,在我们打印的结果里面,前面两个对象是一样的。只是我们给这个同样的对象,在两次的情况下赋值不一样而已。所以按造这种思路,我们如果玩英雄联盟,如果只分法师和刺客两类的话。那么我们不用每个英雄都去创建对象。而只需要根据不同的场景。给这个对象赋上不同的属性就可以了。这样的模式在我们日常开发当中也可以使用,尤其是非常多对象的场景,可以考虑能否利用这种进行处理。

com.example.design.flyweight.Share@51016012
com.example.design.flyweight.Share@51016012
com.example.design.flyweight.Share@29444d75
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值