2012-09-16 74 views
0

真是一個簡單的問題。如何根據Java中的變量值調用不同的構造函數

class salad 
class chef_salad extends salad 
class ceasar_salad extends salad 

所以我有一個變量type,我想創建一個基於類型合適的對象。

顯然,我可以做

if(type.equals("chef"){ salad s = new chef_salad(); } 

我想我甚至可以作出這樣一個返回salad對象,而是一個靜態方法,這真的是最好的辦法還是有更好的方式,通過構造函數來做到這一點?

ps。虛構的例子

+0

只是一個側面說明,如果你不希望人們誰都會讀/維持你的Java代碼到說壞話,堅持java代碼約定:):http://en.wikipedia.org/wiki/Naming_convention_(programming)#Java –

回答

3

我會做這樣的:

public static Salad createSaladInstance(String type) 
{ 
    if(type.equals("Salad")) return new Salad(); 
    else if(type.equals("ChefSalad")) return new ChefSalad(); 
    // ... 
} 

// ... 

Salad s = createSaladInstance(type); 
+0

如果這是'合法',那就好了!然而@Vikdor工廠模式可能更適合更復雜的案例,並且總體上更好的做法。兩者皆爲+1。 –

10

你正在談論Factory pattern你想要隱藏在繼承層次結構中基於輸入實例化給定類型的對象的邏輯。

public class SaladFactory 
{ 
    public Salad getSalad(type) { 
     if ("chef".equals(type) { 
      return new ChefSalad(); 
     } 
     ... 
    } 
} 
+0

我知道必須有這樣的設計模式!那麼工廠就是這麼做的?我是否應該將其設爲靜態或者有充分的理由不這樣做? –

+0

+1:但它具體是工廠方法模式。還有其他的工廠模式... –

+0

對@DonRoby,我也意味着工廠方法。 – Vikdor

1

查看Factory Design pattern

public interface SaladFactory 
    { 
    public Salad createSalad(); 
    public String getName(); 
    } 

for(SaladFactory factory:factories) 
{ 
if(factory.getName().equals("caesar")) return facory.createSalad(); 
} 
相關問題