我想在Java中正确实现工厂模式。我已经这样做了(下面的代码),任何人都可以指出这是否是一种"正确"的方式,或者有任何设计缺陷?
我的想法/限制是:
- 必须有其他东西可以子类化这个工厂,所以我没有选择让它成为一个枚举。
- 我把它变成了一个单例工厂,这样就不会有其他工厂在乱跑
- 我想让它线程安全,所以我选择将同步锁定放在
self
- 工厂里没有一吨的东西,所以性能(空间/时间)没什么大不了 的。
代码如下所示:
public class MyFactory {
private static MyFactory self;
private MyFactory() {
synchronized (self) {
if (self == null) {
self = new MyFactory();
}
}
}
}
这段代码会给我带来问题吗?
另一种选择是这样的
public class MyFactory {
private static MyFactory self = new MyFactory();
}
哪一个更好,这些类型的惰性实例化与急切实例化的注意事项是什么?
一种批评是,能够子类要求和单例要求不一致 - 如果你想能够子类工厂,你必须使构造函数不是私有的,这使得工厂不是单例。