Java---設計模式(單例變形)多例
阿新 • • 發佈:2019-01-28
★ 快取在單例中的使用(“單例+快取”技術)
快取在程式設計中使用很頻繁,有著非常重要的作用,它能夠幫助程式實現以空間換取時間,通常被設計成整個應用程式所共享的一個空間,現要求實現一個用快取存放單例物件的類。
說明:該快取中可以存放多個該類物件,每個物件以一個key值標識,key值相同時所訪問的是同一個單例物件。
package Multiton.multiton1; import java.util.HashMap; import java.util.Map; //單例的第一種變種---快取的單例---這是不能控制個數的單例 public class BufferMultiton { //定義用來快取資料的容器 private static Map map = new HashMap(); //在這裡宣告一下:構造方法可以不用私有化(這點跟單例是不一樣的!) //所以在這裡我就是用預設的空參構造方法算了 public static BufferMultiton getInstance(String key){ //到容器(快取中)去查詢key值所對應的物件,如果沒有,那麼就new一個並且新增到容器中去,否則直接返回去 BufferMultiton bum = map.get(key); if(bum==null){ bum = new BufferMultiton(); map.put(key, bum); } return bum; } }
package Multiton.multiton1; //單例的變種第一種-----快取的單例---這是不能控制個數的單例的測試 public class MultitonTest { public static void main(String[] args) { BufferMultiton bum1 = BufferMultiton.getInstance(""+1); BufferMultiton bum2 = BufferMultiton.getInstance(""+2); System.out.println(bum1); System.out.println(bum2); } }
★ 單例變形——多例模式(“單例+快取+控制例項個數”技術)
把上面快取的單例實現,做成一個能夠控制物件個數的共享空間,供整個應用程式使用。在快取中維護指定個數的物件,每個物件的key值由該類內部指定,有外部請求時直接返回其中一個物件出去。
說明:相當於維護一個指定數量的物件池,當請求個數超過控制的總數時,開始迴圈重複使用 。
package Multiton.multiton2; import java.util.HashMap; import java.util.Map; //單例的第二種變種---快取的單例--這是能控制個數的單例 public class BufferMultiton { //定義用來快取資料的容器 private static Map map = new HashMap(); private static int count = 3; //控制快取中例項的總數 private static int num=1; //當前例項的序號(即所謂的key值) //在這裡宣告一下:構造方法可以不用私有化(這點跟單例是不一樣的!) //所以在這裡我就是用預設的空參構造方法算了 public static BufferMultiton getInstance(){ //到容器(快取中)去查詢key值所對應的物件,如果沒有,那麼就new一個並且新增到容器中去,否則直接返回去 BufferMultiton bum = map.get(num); if(bum==null){ bum = new BufferMultiton(); map.put(num, bum); } if(num++>count){ num=1; } return bum; } }
package Multiton.multiton2;
//單例的變種第二種---快取的單例--這是能控制個數的單例的測試
public class MultitonTest {
public static void main(String[] args) {
BufferMultiton bum1 = BufferMultiton.getInstance();
BufferMultiton bum2 = BufferMultiton.getInstance();
System.out.println(bum1);
System.out.println(bum2);
}
}