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

这是我的代码:

abstract class CreditCard{

    String cardNumber;

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


我所有的子类(例如万事达卡,Visa等)都扩展了CreditCard超类。

我的子类之一的示例:

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

09-19 15:36