如何防止具体类的实例化?

时间:2014-03-31 10:00:49

标签: java design-patterns

假设我有一个Record接口,我可以拥有N个具体的实现类,例如。 PropertyRecordsLoanRecords等。如何确保客户端使用新关键字创建这些N类的对象?

如果我有一个单独的子类,它很容易;我可以使所有的构造函数包都是私有的;这样我就可以在同一个包中编写一个Factory类,它将有一个负责创建实例的方法。但是如何创建一个能够创建单个接口或抽象类的多个实现的虚拟Factory

希望我能够正确对待自己。请询问是否需要澄清。

谢谢。

2 个答案:

答案 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)

我并不完全确定我理解你想要达到的目标(对此不予评论),但这是我的想法:

  1. 听起来你真正想要的是实现Flyweight设计模式(http://en.wikipedia.org/wiki/Flyweight_pattern)。
  2. 如果您真的想在描述时实现这一点(同样,在我理解正确的假设下),以下内容应该有效:

    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 ++;
        }
    }