1. 享元模式(Flyweight Pattern)
- 定义:Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象
- 享元,即被共享的单元
- 作用:对象复用(减少对象的创建),节省内存
1.2 享元模式在 Interger 的应用
Integer(包装器类型) 使用享元模式来复用对象
如果要创建的 Integer 对象的值在 -128 到 127 之间(一个字节的大小),会从 IntegerCache 类中直接返回,否则才调用 new 方法创建
2. 示例:实现对象池
享元模式(Flyweight Pattern)是池技术的重要实现方式
虽然可以使用享元模式可以实现对象池,但是这两者还是有比较大的差异,对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式在主要解决的对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点
public class SignInfoFactory {
private static HashMap<String, SignInfo> pool = new HashMap<>();
@Deprecated
public static SignInfo getSignInfo() {
return new SignInfo();
}
/**
* 从池中获取对象
*/
public static SignInfo getSignInfo(String key) {
SignInfo result;
if (!pool.containsKey(key)) {
result = new SignInfo4Pool(key);
pool.put(key, result);
System.out.println(key + "---建立对象,并放入池中");
} else {
result = pool.get(key);
System.out.println(key + "---直接从池中取得");
}
return result;
}
}
@Data
@AllArgsConstructor
public class SignInfo4Pool extends SignInfo {
/**
* 把相同属性提取出来组成一个唯一key
*/
private String key;
}
@Data
public class SignInfo {
private String id;
private String location;
private String subject;
private String postAddress;
}
测试
public class SignInfoTest {
@Test
public void test1() {
for (int i = 0; i < 10; i++) {
SignInfo singInfo = SignInfoFactory.getSignInfo();
System.out.println(singInfo);
}
}
@Test
public void test2() {
for (int i = 1; i < 6; i++) {
for (int j = 1; j < 3; j++) {
String key = "科目" + i + "考试地点" + j;
SignInfoFactory.getSignInfo(key);
}
}
SignInfo signInfo = SignInfoFactory.getSignInfo("科目2考试地点2");
System.out.println(signInfo);
}
}
网友评论