And*_*rew 14 java generics factory-pattern
我不相信我正在实现工厂模式,因为Application类' createDocument方法接受任何类类型,而不仅仅是子类Document.
换句话说,有没有办法可以限制createDocument方法只接受子类Document?
Document.java
package com.example.factory;
public abstract class Document {
public Document() {
System.out.println("New Document instance created: " + this.toString());
}
}
Run Code Online (Sandbox Code Playgroud)DrawingDocument.java
package com.example.factory
public class DrawingDocument extends Document {
public DrawingDocument() {
System.out.println("New DrawingDocument instance created: " this.toString());
}
}
Run Code Online (Sandbox Code Playgroud)Application.java
package com.example.factory;
public class Application {
public <T> T createDocument(Class<T> documentClass) {
try {
return documentClass.newInstance();
} catch (InstantiationException e) {
throw new IllegalArgumentException(e);
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
};
}
Run Code Online (Sandbox Code Playgroud)Main.java
package com.example.factory;
public static void main(String[] args) {
Application application = new Application();
application.createDocument(DrawingDocument.class);
}
Run Code Online (Sandbox Code Playgroud)Yet*_*eek 18
您应该绑定您的泛型,以便它只使用继承Document的T.例:
public class Application {
//Add extends Document after T
public static <T extends Document> T createDocument(Class<T> documentClass) throws InstantiationException, IllegalAccessException {
return documentClass.newInstance();
};
}
Run Code Online (Sandbox Code Playgroud)
代码看起来不错.在实际实现中,不应声明工厂方法抛出任何与反射相关的异常.无论如何,您可能会有一些不同的代码来创建文档.
例如,faxtory方法应该将a Class<? extends Document>作为其参数,以便人们不能要求它创建一个String.
[更新:]代码示例:
public Document createDocument(Class<? extends Document> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
throw new IllegalArgumentException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10821 次 |
| 最近记录: |