我正在学习面向对象的概念,这是我前一个问题的延续。只是为了练习,我正在设计一副牌。我在心中这两款卡片设计图案中哪款更稳定/首选?
public interface ISuit {
String getLogo();
String getName();
}
public class Card {
ISuit suit;
Integer n;
public Card(ISuit suit, Integer n) {
this.suit = suit;
this.n = n;
}
void setSuit(ISuit suit){
this.suit = suit;
}
void display(){
System.out.println(suit.getName()+","+n);
}
}
其次模式
public interface Icard<T extends ISuit> {
T getSuit();
String getNumber();
}
public class Queen<E extends ISuit> implements Icard<E> {
Class<E> clazz;
public Queen(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public String getNumber() {
return "12";
}
@Override
public E getSuit() {
try {
return clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
显然,第一个是更加直观和直接的两种模式。在那边,我会用正确的西装,数字作为参数的52个卡的对象。
在第二个设计中,我将为每张卡片索引创建13个类,然后用正确的套装实例化它们。将来,如果有新的索引,我可以创建一个扩展Icard的新类。
作为一个新手,我无法弄清楚是否有任何第二个设计的缺点,或者我违反了任何设计原则。
请问有人可以帮助我吗?
随着第二个设计,你将不得不创建13个几乎相同的类,这是浪费,它比它需要更复杂。你的getSuit方法是浪费的,每次调用都会创建一个新的对象。考虑使用一个枚举类的西装。使字段私有和最终,所以卡实例是不可变的。 – 2014-09-21 09:02:33
用于学习/练习面向对象的概念,考虑另一个领域,比如建模车辆(汽车,自行车,卡车)的库存,这些车辆具有非常不同的实现方式和属性,但共享很多行为。 – ataulm 2014-09-21 09:06:21