2016-04-11 27 views
1

我寫了一個GUI供用戶輸入他/她的信用卡號碼。該程序必須返回正確的信用卡類的子類,如萬事達,Visa等基於布爾值返回信用卡的設計模式

這裏是我的代碼:

abstract class CreditCard{ 

    String cardNumber; 

    public CreditCard(String number) { 
     cardNumber = number; 
    } 
} 

我所有的子類,如萬事達,維薩等擴展信用卡式超。

我的子類的一個實例:

class MasterCC extends CreditCard { 

    public MasterCC(String number) { 
     super(number); 
    } 
} 

我選擇了工廠設計模式

class CreditCardFactory { 

    static CreditCard createCard(String number) { 
     CreditCard cc = null; 

     if (number.length() == 0 || number.length() > 19) 
      return cc; 
     else if (isMasterCard(number)) 
      cc = new MasterCC(number); 
     else if (isVisa(number)) 
      cc = new VisaCC(number); 
     else if (isAmericanExpress(number)) 
      cc = new AmExCC(number); 
     else if (isDiscover(number)) 
      cc = new DiscoverCC(number); 
     return cc; 
    } 

    private static boolean isMasterCard(String number){ 

     if (number.length() != 16) 
      return false; 
     return (number.charAt(0) == '5' 
      && 1 >= Integer.valueOf(number.charAt(1)) 
      && Integer.valueOf(number.charAt(1)) <= 5); 
    } 
    // more code boolean code 
} 

我的教授說重做它,因爲它是不是一個好的設計模式來解決這個問題。她說責任不應該是工廠的工作,而應該是子類的工作。

我的解決辦法:

class CreditCardFactory { 


    public static CreditCard createCard(String number){ 
      CreditCard cc[] = { new AmExCC(number), new VisaCC(number)}; 

      for(int index=0; index<cc.length; index++) 
        if(cc[index].isMyType()) 
         return cc[index]; 

    return null; 
} 

}

+1

他沒有提供任何建議,只是「重做它」...? –

+0

這是她。她說驗證哪個子類應該是子類的責任的責任。 –

+2

也許她提出了一個靜態方法來檢查這些標準例如:MasterCard.CheckType()來證明卡是否爲主 –

回答

2

從我的角度來看,你只需要那些布爾方法轉移到具體的類。工廠方法可能看起來類似於:

static CreditCard createCard(final String number) { 

    if (MasterCC.isValidNumber(number)) { 
     return new MasterCC(number); 
    } 

    if (VisaCC.isValidNumber(number)) { 
     return new VisaCC(number); 
    } 

    if (AmExCC.isValidNumber(number)) { 
     return new AmExCC(number); 
    } 

    if (DiscoverCC.isValidNumber(number)) { 
     return new DiscoverCC(number); 
    } 

    return null; 
}