2016-05-07 24 views
0

我有一次採訪中的一個問題,我有2種類型的食物,說麪包和蛋糕,給出如下:Java的工廠模式,創建特定類

public class FoodFactory{}; 

public class Food{}; 

public static void main(String[] args) { 
    Food foo = FoodFactory.get("bread"); 
    System.out.println(foo.getClass().getName()); 
} 

鑑於FoodFactory類和Food類,我不確定如何使這項工作,以便它打印出"bread"爲班。它真的好像得到它印刷麪包的唯一方法是創建一個Bread類並讓FoodFactory返回。

我只是想知道我是否缺少任何東西,因爲FoodFactoryFood是給定的類,所以我認爲這些是我需要改變的唯一兩個類。有沒有辦法實施這兩個班級,並使用這兩個班級打印"bread"

+0

會很好的尊重Java語法,especia lly爲這麼短的片段 – Dici

+1

*「我有兩種類型的食物,比如麪包和蛋糕」* - 他們應該是兩個延伸'Food'的具體類,我想。因此,工廠選擇哪一類產生參數。 –

+1

簡短的回答是否定的。如果沒有叫Bread的類,那麼'getClass()。getName()'永遠不會打印「Bread」。 –

回答

2

因此,一種方法是製作一個類Bread,它擴展了類Food,並且FoodFactory.get()根據傳遞的字符串返回適當的對象。

class Food {}; 

class Bread extends Food {}; 

class FoodFactory { 
    public static Food get(String type){ 
     switch(type){ 
      case "bread" : return new Bread(); 
      default : return new Food(); 
     }  
    } 
} 

另一種方法是使用反射。

0

除非你在運行時編譯一個新的類(這是可能的,但在這裏不適用),如果你想返回一個Bread實例,你當然需要添加一個類。

0

理想情況下,Food應該變成最好的接口或抽象類。然後你有類BreadCake執行/延伸Food。你的FoodFactory有一個靜態方法get接受作爲一個字符串的食物。根據這個值,你實例化並返回一個具體的類,它會給你打印類名時需要的東西。

0

我認爲面試官所問的真正問題是如果你瞭解模式和多態性。如其中一條評論getClass().getName()中所述,除非真的有面包課程,否則不會返回「麪包」。你所能做的就是向面試官建議Food是基類,在這種情況下應該擴展CakeBread類,甚至建議將其改爲抽象類或接口。然後你可以提出一個簡單的工廠類,它會在基類接口後面創建所需的「隱藏」實現。

0

你的問題基本上是Java Factory Design Pattern的一個例子。 假設您有一個項目,分別是具有多個Interfaces和不同類的類層次結構,那麼創建任何類的最簡單方法是什麼?這是工廠來處理所有關於類實例創建操作的地方。

現在你的情況下,方便的辦法是改變你的Class Food一個接口,例如:

public interface Food { 
    String getType(); 
} 

現在,您需要CakeBread類,實現interface Food

public class Cake implements Food{ 
    @Override 
    public String getType() { 
     return "Cake"; 
    } 
} 

public class Bread implements Food{ 
    @Override 
    public String getType() { 
     return "Bread"; 
    } 
} 

現在您需要定義您的FoodFactory類,該類有一個靜態的get方法,該方法返回Food,具體取決於具有蜜蜂的標準提供。

public class FoodFactory { 
    public static Food get(String classifier){ 
     if(classifier.equals("Cake")) return new Cake(); 
     if(classifier.equals("Bread")) return new Bread(); 
    //no matching Food to create  
    throw new IllegalArgumentException("The " + classifier + " is not a valid classifier"); 
    } 
} 

一旦你有你的工廠,你可以用它來進行任何創建操作。 如果你想從食品例如打印出Bread,你可以這樣實現這一點:

//food is now an instanceof Bread 
Food food = FoodFactory.get("Bread"); 
System.out.println(food.getType()); 

這只是簡單地打印

Bread

另外: 要確保每一個創造的處理只有FoodFactory你應該使你的食物類的每一個構造函數protected