基于布尔值返回信用卡的设计模式



我为用户编写了一个GUI来输入他/她的信用卡号。该程序必须返回正确的信用卡类别子类,如万事达卡、Visa等。

这是我的代码:

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

我的所有子类,如万事达卡、Visa等,都扩展了信用卡超类。

我的一个子类示例:

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;
}

}

从我的角度来看,您只需要将这些布尔方法移动到具体的类中。工厂的方法可能看起来像这样:

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;
}

最新更新