1. 程式人生 > >Java---設計模式(單例變形)多例

Java---設計模式(單例變形)多例

★ 快取在單例中的使用(“單例+快取”技術)

快取在程式設計中使用很頻繁,有著非常重要的作用,它能夠幫助程式實現以空間換取時間,通常被設計成整個應用程式所共享的一個空間,現要求實現一個用快取存放單例物件的類。
說明:該快取中可以存放多個該類物件,每個物件以一個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);
	}
}