★ 緩存在單例中的使用 緩存在編程中使用很頻繁,有着非常重要的作用,它能夠幫助程序實現以空間換取時間,通
常被設計成整個應用程序所共享的一個空間,現要求實現一個用緩存存放單例對象的類。
說明:該緩存中可以存放多個該類對象,每個對象以一個key值標識,key值相同時所訪問的是同一個單例對象。
代碼如下:
-
//緩存
-
import java.util.HashMap;
-
import java.util.Map;
-
//本例中,因為沒有定義最大容量,所以"理論上"是可以無限制添加的,直至系統崩潰
-
public class Student {
-
//定義用於緩存的容器
-
private static Map map = new HashMap();
-
/*本例中,Student類的構造方法不需要私有化,
-
* 因為采用單例模式的是map
-
* 而student是加到map中的
-
*/
-
public static Student getInstance(String key){
-
//到緩存中查找key對應的對象
-
Student stu = map.get(key);
-
if(stu==null){//若為空,則new一個並加到map中
-
stu = new Student();
-
map.put(key, stu);
-
}
-
return stu;
-
}
-
}
★ 單例變形——多例模式 把上面緩存的單例實現,做成一個能夠控制對象個數的共享空間,供整個應用程序使用。在
緩存中維護指定個數的對象,每個對象的key值由該類內部指定,有外部請求時直接返回其中一個對象出去。
說明:相當於維護一個指定數量的對象池,當請求個數超過控制的總數時,開始循環重復使用 。
代碼如下:
-
//單例的變種--多例
-
import java.util.HashMap;
-
import java.util.Map;
-
//本例中,count的值決定了緩存區的最大容量
-
public class Student_2 {
-
private static Map map = new HashMap();//將緩存當作單例
-
private static int count=4;//緩存區的實例總數(該整數可以采用用戶設置或讀取配置文件的方式更改)
-
private static int num=1;//當前實例(對象)的序號--用num來當作內部維護的key
-
-
public static Student_2 getInstance(){
-
Student_2 stu = map.get(num);
-
if(stu==null){
-
//若stu為空,則new一個出來並加到map中
-
stu = new Student_2();
-
map.put(num, stu);
-
}
-
num++; //序號不斷變化,循環利用緩存區
-
if(num>count){
-
num= 1;//重置當前實例的序號
-
}
-
return stu;
-
}
-
}