目录
一、享元模式:
享元模式主要是共享通用对象的模式,是一种对象实例的创建策略,其目的是减少内存占用和提高系统访问的性能。比如一些较大的对象通常比较消耗内存,需要查询大量的接口或数据库资源,因此有必要统一抽离出来作为共享的对象使用。
主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
何时使用:
1、系统中有大量对象。
2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。
关键代码:用 Map集合存储这些对象。
二、代码实现:
程序员缺的是什么,缺的是对象,假如有一天,我们能不断的收集对象是不是一件很开心的事!
下面我们就用享元模式来收集对象,体验一下当皇帝的感觉!哈哈。。。
1.创建一个对象类:
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
/**
* @Description: 女朋友类
* @Author: yangshilei
*/
@Data
public class GirlFriend {
private String name;
// 模拟对象一些共有的属性
private static final String boyFriend = "狗狗大蛇";
/**
* 根据名称构造对象
*
* @param name
*/
public GirlFriend(String name) {
this.name = name;
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}
2.创建工厂类,生成基于给定信息的实体类的对象:享元工厂,Map结构存放对象实例。
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @Description: 工厂类
* @Author: yangshilei
*/
public class GirlFriendFactory {
/**
* 享元模式的核心关键代码:
*/
private static final Map<String, GirlFriend> girlFriendMap = new HashMap<>();
/**
* 翻牌女朋友
* @param name
* @return
*/
public static GirlFriend getGirlFriend(String name) {
// 从map集合中获取某个名字的女朋友
GirlFriend girlFriend = girlFriendMap.get(name);
if (Objects.isNull(girlFriend)) {
System.out.println("没有女朋友叫"+name+"的,现在就去找一个!");
// 若获取不到,new一个女朋友存入集合,后续翻到牌的时候直接从集合中获取!
// 此处也可以从数据库或其它地方获取需要的对象;
girlFriend = new GirlFriend(name);
girlFriendMap.put(name,girlFriend);
return girlFriend;
}
System.out.println("这个女朋友存在,身份信息:" + JSON.toJSONString(girlFriend));
return girlFriend;
}
}
3.测试类:
public class GirlFriendDemo {
public static void main(String[] args) {
GirlFriend girlFriend1 = GirlFriendFactory.getGirlFriend("小红");
GirlFriend girlFriend2 = GirlFriendFactory.getGirlFriend("阿花");
GirlFriend girlFriend3 = GirlFriendFactory.getGirlFriend("洋妹子");
// ----------在此之后获取之前已经翻牌没翻到过的女朋友;----------
GirlFriend girlFriend4 = GirlFriendFactory.getGirlFriend("小红");
GirlFriend girlFriend5 = GirlFriendFactory.getGirlFriend("洋妹子");
}
}
执行结果:
没有女朋友叫小红的,现在就去找一个!
没有女朋友叫阿花的,现在就去找一个!
没有女朋友叫洋妹子的,现在就去找一个!
这个女朋友存在,身份信息:{"name":"小红"}
这个女朋友存在,身份信息:{"name":"洋妹子"}
Process finished with exit code 0
三、总结
日常开发中,享元模式我们用的并不多,除了一些线程池、数据库连接池等场景会使用到。享元模式的设计思想就是减少内存的使用,与原型模式通过复制对象的方式生成复杂对象、减少PRC调用的思想是类似的。