我正在测试一种不同的模式。我已经在switch
声明中使用了代码,但是我想尝试一些更为折衷的东西......用于研究目的。
假设我有4个课程,Class1
,Class2
,Class3
和Class4
都延伸BaseClass
。我想把它们放进enum
,就像这样:
enum ClassFactories {
Class1(Class1.class),
Class2(Class2.class),
Class3(Class3.class),
Class4(Class4.class);
private final Class factory;
ClassFactories(Class factory) {
this.factory = factory;
}
public BaseClass generate() {
BaseClass b = null;
try {
b = (BaseClass)this.factory.newInstance();
} catch (Exception e) {
// handle any exceptions
}
return f;
}
}
在传递int
的工厂方法中,我希望能够做到这样的事情:
public void fakeMethod(int type) {
BaseClass someClass = ClassFactories.values()[type].generate();
someClass.doStuff();
}
有更清洁/更简单的方法吗?我不太关心可读性(现在),我只是好奇这是否可能。
答案 0 :(得分:3)
是的,这是可能的。类似于“模板方法”的方法。例如,
public enum ClassFactory {
Class1() {
@Override public void generate() {
System.out.println("I'm in Class 1.");
}
},
Class2() {
@Override public void generate() {
System.out.println("I'm in Class 2.");
}
};
//template method
public abstract void generate();
private static final Map<Integer, ClassFactory > lookup
= new HashMap<Integer, ClassFactory >();
static {
for (ClassFactory s : EnumSet.allOf(ClassFactory.class))
lookup.put(s.getIntValue(), s);
}
public static ClassFactory getValue(int intValue) {
return lookup.get(intValue);
}
}
使用静态导入时,调用此枚举的客户端代码如下所示:
Class1.generate();
Class2.generate();
//or better...
getClass().generate();
或者
public void fakeMethod(int type) {
ClassFactory.getValue(type).generate();
}