2016-11-24 42 views
0

我有一個工廠,從XML文件創建,是否可以避免長 - 如果 - 其他,如果XML是動態的,我不想硬編碼的對象? 的Java代碼 -如何避免長時間工廠中的其他人?

public static IDevice createDevice(String name, Element element) { 
    IDevice device; 
    if (name.equals("Autopilot")) { 
     String strSpeed = element.getAttribute("maxSpeed"); 
     int speed = Integer.parseInt(strSpeed); 
     device = new AutoPilot(speed); 
     return device; 
    } else if (name.equals("Camera")) { 
     device = new CameraDevice(); 
     return device; 
    } else if (name.equals("ClassifiedDevice")) { 
     device = new ClassifiedDevice(); 
     return device; 
    } 

    return null; 

} 

有「設備」,在不同性質的XML文件,以及工廠創建它們取決於被選中以創建。但設備列表是動態的,可以在未來擴展。

<UAV> 
<Device name="Autopilot"  maxSpeed = "70" minSpeed = "40" /> 
<Device name="Camera"   maxRange = "7000"      /> 
<Device name="ClassifiedDevice" range = "8000" time  = "4"  /> 
</UAV> 
+1

顯示一些codez人 –

+1

的,工廠應該做的是什麼?閱讀xml,並根據這些創建什麼樣的東西?並使用什麼語言? – GhostCat

+0

假設這是Java,有很多可能的答案,但我的第一個停靠點首先會問你是否需要所有這些不同的類。如果答案是「是」,那麼在IDevice接口和這個工廠中是否有任何價值。如果答案仍然是「是」,則可以查看諸如JAXB/XStream(根據您指定的規則爲您執行xml反序列化)或使用枚舉或映射來存儲創建策略的內容。 – biziclop

回答

-1

一般來說,如果你想避免長時間else if是你可以(根據您的語言,但我想這是C#或Java的可能)使用switch聲明。這是你在找什麼?

例如,在C#(可能看起來在Java中一樣,不知道):

switch(name) 
{ 
    case "Autopilot": 
     var strSpeed = element.getAttribute("maxSpeed"); 
     var speed = int.parse(strSpeed); 
     return new AutoPilot(speed); 
     return device; 
    //other cases ... 
    default: 
     // unknown device? 
     // return some default value or thrown exception or whatever you want :D 
} 

您也可以嘗試的功能的方式,也許是這樣的: (注:這是C#,我不知道如果這個工程在Java中,但據我所知應該有一個等價物)

var factories = new Dictionary<string, Func<IDevice>> 
{ 
    { "Autopilot",()=>{ 
     string strSpeed = element.getAttribute("maxSpeed"); 
     var speed = int.parse(strSpeed); 
     return new AutoPilot(speed); 
     } 
    }, 
    // more "cases" 
    //{ "", ... } 
}; 

//simply call by: 
IDevice device = factories[name](); // maybe check if the name is in the dictionary first... 
+1

它工作在Java中,只需用'() - >':)替換'()=>' – biziclop

+0

誰曾經低估過,請解釋一下爲什麼,我還在學習自己,所以很高興告訴我什麼是錯的或可以改進..謝謝:) – Stefan

+0

不知道誰投了票。我喜歡lambda表達式的解決方案,但開關盒並不完全符合我的想法 –

相關問題