2012-10-23 31 views
1

我有一個設計問題要問。到目前爲止我還沒有編寫任何代碼,只是想着如何在這一點上實現。我有一個類型爲A的對象,它包含一個類型爲B的對象。我希望B定義一個對象類別(接口或抽象類?)。然後我有一個xml文件,它定義了B應該是的子類型。例如,如果B是名爲Driveable的接口,則可以在xml中將「car」或「truck」定義爲類型A所需的Drivable對象。關於java中工廠方法的設計實現

我在做的是讓B成爲接口並且然後創建一個具有工廠方法的靜態工廠類,以確定應爲哪個子類型B提供一個xml文件。所以我的第一個問題是,這是解決問題的最好方法嗎?使用抽象類而不是接口會更好嗎?還是主要只是個人偏好?

其次,如果我做一個接口去的話,我的工廠方法中會我只是做:

B createB(File f){ 
    ... 
    String type = ... 
    if(type.equals("car")) 
     return new CarType(); 
    else if(type.equals("truck")) 
     return new TruckType(); 
    ... 
    return null; 
} 

所以我每次添加一個新的B子型的時候,我需要,如果再添聲明到這個方法。有沒有更好的方法來做到這一點,所以我不得不做的是創建一個新的B子類型,然後更新我的XML並不更新工廠方法?我基本上不想將B的類型硬編碼到我的工廠方法中。如果我上面的內容是使用工廠方法的非常標準的協議,那麼我可以用這種方式來處理這個問題,但看起來不太合適。

+1

對於這種情況,您需要AbstractFactory模式。在Google上搜索它。你會得到一個鏈接到維基百科,它解釋了它是什麼。 –

+0

雖然我只有一個抽象產品(類型B)。然後,我需要爲B的每個新子類型創建一個新的混凝土工廠。在某些時候,我需要決定使用哪個混凝土工廠。似乎它會呈現相同的「問題」。 – user972276

回答

0

從carnold的示例開始,您可以在工廠類中創建映射xml中的文本和相應的java類之間的映射。

private final static Map<String, Class> typeMap; 

static { 
    typeMap = new HashMap<String, Class>(); 
    typeMap.put("car", CarType.class); 
    typeMap.put("truck", TruckType.class); 
} 

,然後在你的方法:

B createB(File f){ 
    ... 
    String type = ... 
    Class clazz = typemap.get(type); 
    if (clazz == null){ 
     return null; 
    } 

    B newB = clazz.getConstructor(/*arg types*/).newInstance(/*args*/); 
    return newB; 
} 

稍微容易保持比的if/else,但仍然要保持它。

+0

謝謝!張貼後,我正在考慮這樣做。除非按照carnold的建議,在xml中明確指出類名,否則可能沒有辦法完全消除維護。 – user972276

1

你可以做的是XML定義要在B impls是,然後使用泛型類的構造函數是這樣的(缺少的錯誤處理)的實際工作類名:


String bimplClassname = //read from xml 
Class bimplClass = Class.forName(bimplClassname); 
B newB = bimplClass.getConstructor(/*arg types*/).newInstance(/*args*/); 
+0

如果我的xml沒有直接聲明類名,該怎麼辦?在我的例子中,我有用我的xml寫的「car」,但是我的類名是「CarType」。我仍然可以做到這一點嗎? – user972276

+0

只要你可以編程方式將xml中的文本轉換爲實際的java類名稱 –

0

我想這取決於什麼觸發了你的對象的創建。如果它是一些觸發創建的文本,那麼現有的代碼適用於小型應用程序。您也可以選擇依賴注入框架,如Guice

此外,請注意,對於比較字符串,您應該使用.equals方法,而不是==,如代碼中所示。

+0

呵呵,def意味着使用.equals()。目前我只有B的兩個子類型,這些是我將在可預見的將來使用的唯一類型。是的,基本上xml主要在程序第一次啓動時使用,並且用於保存程序的初始參數。定義B的子類型的參數將始終是一個字符串。我不知道我是否想要搞出一些像Guice這樣的小應用程序的麻煩,但它肯定會研究它。 – user972276