我正在學習面向對象的概念,這是我前一個問題的延續。只是爲了練習,我正在設計一副牌。我在心中這兩款卡片設計圖案中哪款更穩定/首選?
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