如何根据接口实现创建新对象

How to create a new object based on interface implementation

首先,我认为我的问题措辞不当,但我真的不明白如何措辞。

我有一个起始界面,许多 classes 正在实施该界面。我想做的是看看是否有一种方法可以创建一个新对象,以便我被传递给通用接口,然后基于方法 .getClass().getSimpleName(),创建一个基于该字符串的新对象.

是创建 switch case 语句的唯一方法吗?由于实现的数量class太多了(大概100个左右)。

参考代码:

public interface MyInterface {
  public void someMethod();
}

然后我将实施 classes:

public class MyClass1 implements MyInterface {
  public void someMethod() { //statements }
}

public class MyClass2 implements MyInterface {
  public void someMethod() { //statements }
}

public class MyClass3 implements MyInterface {
  public void someMethod() { //statements }
}

我最后想要的是另一个 class,它传递了一个 MyInterface 类型的参数,从中获取简单名称并根据该简单名称创建一个新的 MyClassX 实例。

public class AnotherClass {
  public void someMethod(MyInterface interface) {
    if (interface == null) {
      System.err.println("Invalid reference!");
      System.exit(-1);
    } else {
      String interfaceName = interface.getClass().getSimpleName();
      /**
       * This is where my problem is!
       */
      MyInterface newInterface = new <interfaceName> // where interfaceName would be MyClass1 or 2 or 3...
    }
  }
}

非常感谢任何帮助!

您可以为此使用反射:

public void someMethod(MyInterface myInterface) {
Class<MyInterface> cl = myInterface.getClass();
MyInteface realImplementationObject = cl.newInstance(); // handle exceptions in try/catch block
}

这是许多解决方案的常见问题。当我面对它时,我从不使用反射,因为如果它是一个大项目的一部分很难维护。

当您必须根据用户选择构建对象时,通常会出现此问题。您可以为此尝试使用 Decorator 模式。因此,不是为每个选项构建不同的对象。您可以构建单个对象,根据选择添加功能。例如:

// you have
Pizza defaultPizza = new BoringPizza();

// user add some ingredients
Pizza commonPizza = new WithCheese(defaultPizza);

// more interesting pizza
Pizza myFavorite = new WithMushroom(commonPizza);

// and so on ...

// then, when the user checks the ingredients, he will see what he ordered:
pizza.ingredients();
// this should show cheese, mushroom, etc.

引擎盖下:

class WithMushroom implements Pizza {
    private final Pizza decorated;
    public WithMushroom(Pizza decorated) {
        this.decorated = decorated;
    }
    @Override
    public Lizt<String> ingredients() {
        List<String> pizzaIngredients = this.decorated.ingredients();
        // add the new ingredient
        pizzaIngredients.add("Mushroom");
        // return the ingredients with the new one
        return pizzaIngredients;
    }
}

重点是您没有为每个选项创建一个对象。相反,您创建具有所需功能的单个对象。每个装饰器都封装了一个功能。