1、概念
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建,这就是享元模式,类似与String在静态常量池中一样。
2、场景
1、系统有大量相似对象。 2、需要缓冲池的场景。
3、核心点
1、使用HashMap存储这些对象。 2、结合工厂类使用 3、注意划分外部状态和内部状态,否则可能会引起线程安全问题。内部状态就是常量数据就是a,不能更改,但是外部状态在前端页面显示a的时候,字体在不同页面可以显示不一样的字体和背景色。
4、代码实现
public interface School { void use(); }
public class XiaoSchool implements School { public String name; public String like; public XiaoSchool(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLike() { return like; } public void setLike(String like) { this.like = like; } @Override public void use() { System.out.println("我叫"+name+",喜欢:"+like); } }
public class SchoolFactory { private static final Map<String,XiaoSchool> maps = new HashMap<>(); public static XiaoSchool getSchool(String name){ XiaoSchool xiaoSchool = maps.get(name); if (xiaoSchool == null){ xiaoSchool = new XiaoSchool(name); maps.put(name,xiaoSchool); } return xiaoSchool; } public static int getSize(){ return maps.size(); } }
main函数执行
public static void main(String[] args){ String name = "杨幂"; for (int i = 0; i<5;i++){ XiaoSchool xiaoSchool = SchoolFactory.getSchool(name); xiaoSchool.setLike("胡歌"); xiaoSchool.use(); System.out.println(SchoolFactory.getSize()); } }
结果
我叫杨幂,喜欢:胡歌 1 我叫杨幂,喜欢:胡歌 1 我叫杨幂,喜欢:胡歌 1 我叫杨幂,喜欢:胡歌 1 我叫杨幂,喜欢:胡歌 1
结束:自己敲一遍代码就懂了,看是看不会的。