簡體   English   中英

除了使用if else和switch之外,如何以工廠模式確定子類類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM