![](/img/trans.png)
[英]How can i implement Factory pattern without using if else or switch case in spring using annotations
[英]how to determine the subclass type in a factory pattern other than using if else and switch?
我想嘗試工廠模式並能夠實現它,但是當
生成了多個類,我認為這將是丑陋的! 因此,任何澄清或建議將不勝感激...
我的超類:
public abstract class Output {
public abstract void generate(Data dat); }
我得到了我的其他類從輸出擴展
public class generateXML extends Output{
.
.
.
}
我的問題與這里有關:
public class generatorFactory(){
public Output generate(String str){
//或獲取對象作為參數,例如(Object obj)
if(str.equals("xml"){
return new generateXML();
}
else if.........
......
}
有什么方法可以確定子類類型,從而避免檢查每種類型?
您應考慮將if-else鏈替換為地圖。
不必編寫檢查您要支持的所有字符串的代碼,您只需擁有幾行代碼即可從地圖中檢索元素。
當然,您將需要更多配置代碼才能將項目放入地圖中,但這應該是微不足道的。
這是有關此主題的不錯的文章(用PHP)
您可以使用可以傳遞給工廠的enum
,並根據傳遞的enum
返回工廠對象。 唯一的事情是您不能將其導出為API。
enum Type
{
XML {
@Override
public Object getFactory() {
// TODO Auto-generated method stub
return null;
}
};
public abstract Object getFactory();
}
如果您必須像API一樣公開它,則可以執行以下操作。
interface IType {
public abstract Object getTypeFactory();
}
enum Type implements IType {
XML {
@Override
public Object getTypeFactory() {
// TODO Auto-generated method stub
return null;
}
};
}
並將Factory方法實現更改為
public static Object getFactoryByType(String name) {
Type type = Type.valueOf(name);
return type.getTypeFactory();
}
您可以使用反射。
Object generated = getClass().getMethod("generate" + type.toUpperCase()).invoke(this);
public Object generateXML();
public Object generateJSON();
public Object generateCSV();
您可以使用newInstance()實例化一個生成器,該生成器的類名是通過參數構建的:
public Generator getGenerator (final String type)
{
final Class generatorClass = ClassLoader.getSystemClassLoader().loadClass("Generator"+type);
final Generator generator = (Generator) (generatorClass.newInstance());
return generator;
}
PS:我高度評價您遵循Java的規則:如果generateXML是一個類,則應將其寫為GenerateXML。
更重要的是:給班級命名時要小心。 (1)對象generateXML應該擴展Output,因為它不是輸出。 (2)“ GenerateXML”是一個動詞,即一個動作。 因此,命名對象不是正確的單詞,而是方法。 您可以根據每個示例將對象命名為“ XMLGenerator”。
由於您每次都必須調用new
我不確定您可以繞開分支過程。 有人必須知道該如何回報您。
如果用於單例,則可以初始化HashMap "xml"=>generateXML singleton
但是,第二秒鍾之后,您可以為不同的Type
類MyTypeXML,MyTypeJSON等修改String屬性,然后使用名稱相同但類型不同的方法。
public Output generate(MyTypeXML xml) { // This will go for XML }
public Output generate(MyTypeJSON json) { // This will go for JSON }
但是對於工廠,我並不反對if ... else編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.