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