我为用户编写了一个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;
}