1. 享元模式(Flyweight Pattern)
- 定義:Use sharing to support large numbers of fine-grained objects efficiently.(使用共享對象可有效地支持大量的細(xì)粒度的對象
- 享元玲昧,即被共享的單元
- 作用:對象復(fù)用(減少對象的創(chuàng)建)坯钦,節(jié)省內(nèi)存
1.2 享元模式在 Interger 的應(yīng)用
Integer(包裝器類型) 使用享元模式來復(fù)用對象
如果要創(chuàng)建的 Integer 對象的值在 -128 到 127 之間(一個(gè)字節(jié)的大小),會從 IntegerCache 類中直接返回栓始,否則才調(diào)用 new 方法創(chuàng)建
2. 示例:實(shí)現(xiàn)對象池
享元模式(Flyweight Pattern)是池技術(shù)的重要實(shí)現(xiàn)方式
雖然可以使用享元模式可以實(shí)現(xiàn)對象池轨域,但是這兩者還是有比較大的差異凛虽,對象池著重在對象的復(fù)用上庄新,池中的每個(gè)對象是可替換的,從同一個(gè)池中獲得A對象和B對象對客戶端來說是完全相同的澄峰,它主要解決復(fù)用嫉沽,而享元模式在主要解決的對象的共享問題,如何建立多個(gè)可共享的細(xì)粒度對象則是其關(guān)注的重點(diǎn)
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 {
/**
* 把相同屬性提取出來組成一個(gè)唯一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 + "考試地點(diǎn)" + j;
SignInfoFactory.getSignInfo(key);
}
}
SignInfo signInfo = SignInfoFactory.getSignInfo("科目2考試地點(diǎn)2");
System.out.println(signInfo);
}
}