<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