假设我有一个Record
接口,我可以拥有N个具体的实现类,例如。 PropertyRecords
,LoanRecords
等。如何确保客户端使用新关键字创建这些N类的对象?
如果我有一个单独的子类,它很容易;我可以使所有的构造函数包都是私有的;这样我就可以在同一个包中编写一个Factory
类,它将有一个负责创建实例的方法。但是如何创建一个能够创建单个接口或抽象类的多个实现的虚拟Factory
。
希望我能够正确对待自己。请询问是否需要澄清。
谢谢。
答案 0 :(得分:1)
不确定为什么要这样,但是你的Factory
类可以使用反射来创建这样的实例:
public class RecordFactory {
public Record newInstance(Class<? extends Record> klass, Object... args) {
Constructor[] ctors = klass.getDeclaredConstructors();
// find the right constructor here..
return ctor.newInstance(args);
}
}
然后您的客户可以创建以下实例:
RecordFactory.newInstance(Loan.class, ...);
答案 1 :(得分:1)
我并不完全确定我理解你想要达到的目标(对此不予评论),但这是我的想法:
如果您真的想在描述时实现这一点(同样,在我理解正确的假设下),以下内容应该有效:
public class Record {
private static final int MAX_INSTANCES = 20;
private static volatile int instanceCounter = 0;
private Record() {
if (instanceCounter >= MAX_INSTANCES)
throw new RuntimeException("max instances exceeded");
instanceCounter ++;
}
}