1. 程式人生 > >單例模式之多例類【設計模式】

單例模式之多例類【設計模式】

單例模式:單例模式

多例類:請使用單例模式編寫一個程式,然後考慮一下如何對這個程式進行改造,使得系統中某個類的物件可以存在有限多個,例如兩例或三例?

法一:最多有max_num例項,如果呼叫次數超過,則預設為max_num

程式碼如下:

public class KFC {
	private static ArrayList<TaoCan> taocan = new ArrayList<TaoCan>();
	static int num = 0;
	static int max_num = 3;
	
	public static TaoCan getinstance(){//最多有max_num種套餐,如果呼叫次數超過,則預設為最後一種
		synchronized (KFC.class) {
			if(num < max_num){
				num++;
				taocan.add(new TaoCan());
			}
		}
		return taocan.get(num-1);
	}
	
}

測試類:

package KFC;

public class Customer {

	public static void main(String[] args) {
		KFC kfc = new KFC();
		TaoCan customer1 = kfc.getinstance();
		TaoCan customer2 = kfc.getinstance();
		TaoCan customer3 = kfc.getinstance();
		TaoCan customer4 = kfc.getinstance();
		TaoCan customer5 = kfc.getinstance();
		System.out.println("customer1 == customer2? " + customer1.equals(customer2));
		System.out.println("customer1 == customer3? " + customer1.equals(customer3));
		System.out.println("customer2 == customer3? " + customer2.equals(customer3));
		System.out.println("customer3 == customer5? " + customer3.equals(customer5));
		System.out.println("customer4 == customer5? " + customer4.equals(customer5));
	}

}

測試結果:

法二:最多有max_num種套餐,按照索引引數確定是哪種套餐

程式碼如下:

public class KFC {
	private static ArrayList<TaoCan> taocan = new ArrayList<TaoCan>();
	static int max_num = 3;
	
	static{
		for(int i = 0; i < max_num; i++){
			taocan.add(new TaoCan());
		}
	}
	
	public static TaoCan getinstance(final int i){//最多有max_num種套餐,如果呼叫次數超過,則預設為最後一種
		synchronized (KFC.class) {
			if(i <= max_num){
				return taocan.get(i-1);
			} else {
				System.out.println("對不起,本店沒有該套餐。。。 i = " + i);
				return null;
			}
		}
	}
	
}

測試類:

package KFC;

public class Customer {

	public static void main(String[] args) {
		KFC kfc = new KFC();
		TaoCan customer1 = kfc.getinstance(1);
		TaoCan customer2 = kfc.getinstance(2);
		TaoCan customer3 = kfc.getinstance(3);
		TaoCan customer4 = kfc.getinstance(4);
		TaoCan customer5 = kfc.getinstance(5);
		TaoCan customer6 = kfc.getinstance(2);
		if(customer1 != null && customer2 != null)
			System.out.println("customer1 == customer2? " + customer1.equals(customer2));
		if(customer1 != null && customer3 != null)
			System.out.println("customer1 == customer3? " + customer1.equals(customer3));
		if(customer2 != null && customer3 != null)
			System.out.println("customer2 == customer3? " + customer2.equals(customer3));
		if(customer3 != null && customer5 != null)
			System.out.println("customer3 == customer5? " + customer3.equals(customer5));
		if(customer4 != null && customer5 != null)
			System.out.println("customer4 == customer5? " + customer4.equals(customer5));
		if(customer6 != null && customer2 != null)
			System.out.println("customer6 == customer2? " + customer6.equals(customer2));
	}

}

測試結果: