2

我有来自外部来源的字符串。基于这个字符串,我必须生成一个对象。我必须生成的所有对象都扩展了相同的抽象基类。我有一个关系“字符串”<->“类”的列表。

我的问题是在哪里做这一代的最佳方式以及如何做?

  1. 我可以使用 if-else 方法创建单独的类。并在我需要的地方调用它。
  2. 我可以把它放在这个 if-else 直接放在我需要的地方
  3. 我可以把它放到抽象类中。
  4. 添加到抽象类Map<String,Class>并尝试使用反射(但我不知道如何)
  5. 别的东西?

abstract class Element { 
    abstract String getType();
}
class AElement extends Element{
    String getType(){return "A";}
}
class BElement extends Element{
    String getType(){return "B";}
}
class CElement extends Element{
    String getType(){return "C";}
}

class MyObject {
   Element element;
   MyObject(String text){
   //here I conscruct my object form string.
   String[] elem = text.split(";");
   this.element = someMethod(elem[3]);
}

我知道 elem[3] 将是文本“A”、“B”和“C”,然后我应该在方法 someMethod() 中创建相应的 AElement、BElement 或 CElement 对象。

4

3 回答 3

3

工厂模式是一个很好的解决方案。它将使您从对象创建技术中抽象出来。

在工厂内部,您可以通过反射创建实例,如下所示:

public static YourAbstract createObject(String className) {
    try {
       Class c = Class.forName(className);
       YourAbstract newObject = (YourAbstract)c.newInstance();
       return newObject;
    } catch (Exception e) {
       // handle the way you need it ... e.g.: e.printStackTrace();
    }
}

看看这个问题:Using reflection in Java to create a new instance with reference variable type set to the new instance class name?

或者,如果工厂知道所有类,则从 config 或类似的东西创建某种映射:

public class YourAbstractFactory {

    private static Map<String, Class> classez = new HashMap<String, Class>();

    public static YourAbstract initFactory(Map<String, Class> classes) {
        // initialize your map
        classez.putAll(classes);
    }

    public static YourAbstract initFactory(Collection<String> classes) {
        // initialize your map
        for(String className : classes) {
            try {
               Class c = Class.forName(className);
               classez.put(className, c);
            } catch (Exception e) {
               // handle the way you need it ... e.g.: e.printStackTrace();
            }
        }
    }

    public static YourAbstract createObject(String className) {
        try {
           Class c = classez.get(className);
           YourAbstract newObject = (YourAbstract)c.newInstance();
           return newObject;
        } catch (Exception e) {
           // handle the way you need it ... e.g.: e.printStackTrace();
        }
    }
}    
于 2012-07-19T08:50:13.730 回答
0

最好的方法是使用工厂模式

public static SomeObject createObject(String externalString){
 //construct the object(Have your If-else here)
 return someObject;
}
于 2012-07-19T08:27:45.700 回答
0

使用能够根据输入创建提供的对象的工厂模式。

于 2012-07-19T08:28:00.090 回答