叶氏.这很容易(除非我误解)
你必须使用原型设计模式(或我在这里展示的变体)
当您在运行时之前不知道工厂类可能是什么时,它很有用.与AbstractFactory不同,您可以在其中创建新类型的不同子类,但您可以根据特定条件选择一个.
使用原型,您可以简单地将“原始”对象(原型)注入到您的应用程序中(通过完整的未来依赖注入框架或简单的类名称),然后创建它的新实例.
这是一个示例代码,显示如何使用变体(不使用clone但newInstance方法)执行此操作
public abstract class Application {
public Application newInstance() {
try {
return this.getClass().newInstance();//this creates an instance of the subclass
} catch( InstantiationException ie ){
throw new RuntimeException( ie );
} catch( IllegalAccessException iae ){
throw new RuntimeException( iae );
}
}
public String toString() {
return "This is the class named: \""+ this.getClass().getSimpleName()+"\"";
}
}
// subclasses doesn't repeat the creation part
// they just have to override specific methods.
class FirstClass extends Application {}
class SecondClass extends Application {}
class ThirdClass extends Application {}
其余代码可以编程到Application接口:
public void doSomethingWith( Application application ) {
System.out.println( application.toString() );
}
public void startApplication( Application app ) {
// etc etc
}
每当您需要新实例时,您只需致电:
Application newApp = original.newInstance();
这将创建正确的类型.
如您所见,子类未指定如何创建新的子类,这些都在基类中.
调用newInstance方法将始终创建一个相同类型的新实例.