單例模式之多例類【設計模式】
阿新 • • 發佈:2019-02-04
單例模式:單例模式
多例類:請使用單例模式編寫一個程式,然後考慮一下如何對這個程式進行改造,使得系統中某個類的物件可以存在有限多個,例如兩例或三例?
法一:最多有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));
}
}
測試結果: