我有一个关于代码风格的问题:
假设我有一个包含一些信息的字符串(例如“Information1”或“Information2”)。基于此我想用工厂创建对象。显然我可以这样写:
if(string.equals("Information1")){
Factory.createInformation1Object();
}
if(string.equals("Information2")){
Factory.createInformation2Object();
}
if(string.equals("Information3")){
Factory.createInformation3Object();
}
现在我想知道是否有更好(更漂亮)的方法来做到这一点。我真的很喜欢访问者模式的多重调度思想,但我看不出有什么方法可以轻松地将其应用于这个特定问题。
最佳答案
您可以使用 abstract factory pattern .
创建摘要 Factory
类 [或接口(interface)],以及扩展它的类:MyObject1Factory
, MyObject2Factory
, ...
在预处理时,填充 Map<String,Factory>
来自String
到对应的Factory
例如,这只在您的应用程序中完成一次。
当您需要创建一个新实例时 - 调用 map.get(string).create()
创建相关类型的相关对象。
编辑:带代码的小示例:
你的类(class)是:
public static class MyBase {
@Override
public String toString() {
return "Base";
}
}
public static class Class1 extends MyBase {
@Override
public String toString() {
return "Class1";
}
}
public static class Class2 extends MyBase {
@Override
public String toString() {
return "Class2";
}
}
你的工厂将是:
public static abstract class MyFactory {
public abstract MyBase build();
}
public static class MyFactory1 extends MyFactory {
@Override
public Class1 build() {
return new Class1();
}
}
public static class MyFactory2 extends MyFactory {
@Override
public Class2 build() {
return new Class2();
}
}
在程序生命周期内只填充一次 map :
Map<String,MyFactory> map = new HashMap<String, Test.MyFactory>();
map.put("class1", new MyFactory1());
map.put("class2", new MyFactory2());
当您需要一个新对象时,调用:
MyBase obj = map.get(s).build();
System.out.println(obj);
(*) 注意:classes 的 static 关键字在这里是因为我将它们创建为内部类 - 当然,如果不是你的情况,你需要省略它....
关于java - Java 中有效且漂亮的字符串条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783788/