我有很多实现相同接口的类。所有这些类的对象必须在主类中实例化。我试图以一种优雅的方式完成这件事(我想通过枚举)。示例代码: -
public interface Intr {
//some methods
}
public class C1 implements Intr {
// some implementations
}
public class C2 implements Intr {
// some implementations
}
...
public class Ck implements Intr {
// some implementations
}
public class MainClass {
enum ModulesEnum {
//Some code here to return objects of C1 to Ck
FIRST {return new C1()},
SECOND {return new C2()},
...
KTH {return new Ck()};
}
}
现在在上面的例子中,我可以通过一些优雅的方式获得C1类到Ck类的新对象的实例。或者任何其他更好的机制而不是枚举也将受到赞赏。
答案 0 :(得分:7)
enum ModulesEnum {
FIRST(new C1()), SECOND(new C2()); // and so on
private ModulesEnum(Intr intr) { this.obj = intr; }
private Intr obj;
public Intr getObj() { return obj; }
}
希望有所帮助。诀窍是为每个枚举添加一个实现。如果要访问该对象,请使用getter。
ModulesEnum.FIRST.getObj();
如果您的Intr
及其实施是package protected
,您可以公开ModulesEnum
来公开实施。这样,每个实现只能有一个实例,使它们singleton
而不显式使用模式。
如果您打算为每个实现设置多个实例,那么当然也可以使用Factory
。
答案 1 :(得分:1)
您需要的是工厂模式。是否需要将Enum类用作工厂本身是另一个问题。你可以这样做:
public enum Module {
FIRST, SECOND, ..., KTH
}
public class ModuleFactory {
public Intr createModule(Module module) {
switch (module) {
case FIRST:
return new C1();
case SECOND:
return new C2();
...
case KTH:
return new Ck();
...
}
}
}
在不知道您打算如何使用这些对象的情况下,我无法确定哪种方法更合适。
答案 2 :(得分:0)
使用静态工厂。
public IntrFactory {
static Intr first() {
return new C1();
}
static Intr second() {
return new C2();
}
...
}