我已经实现了像这样的抽象工厂
public abstract class AbstractFactory {
private static final Map FACTORIES = new HashMap();
AbstractFactory(FactoryType type) {
FACTORIES.put(type, this);
}
public abstract A getA();
public abstract B getB();
public static AbstractCatalogFactory getFactory(FactoryType type) {
return (AbstractCatalogFactory) FACTORIES.get(type);
}
}
具体工厂必须调用此抽象工厂构造函数,从而导致每个具体实现都在FACTORIES
映射中注册。我有点担心在构造函数中引用this
,因为看起来this
的值应该是未定义的,直到构造函数的执行返回。
谢谢, 唐
答案 0 :(得分:2)
this
我有点担心在构造函数中引用
this
,因为在构造函数的执行返回之前,似乎应该未定义this
的值。
更确切地说,this
引用不应该在构造函数完成之前将构造函数泄漏泄露给外部各方。否则,外部方可能最终在尚未完成的新对象上调用方法。
您的实施有可能发生这种情况,因为this
已添加到地图中,外部方可通过静态方法getInstance
访问该地图。补救措施可能是同步对地图的访问。另一种选择(正如Josh Bloch在Effective Java中所讨论的那样)将使任何具体子类中的构造函数变为私有,并在每个子类中使用静态工厂方法来构造对象,然后添加它到地图。这会导致一些代码重复。
显然,您正在实施“工厂目录”而不是“产品工厂”,因此这与经典Abstract Factory完全不同。没有更多细节,很难判断这是否合理。
主要问题是,在这里你统一工厂界面和工厂“存储”,这是IMO不是一个好主意。工厂的客户应该只看到工厂界面的getX
方法,并且不应该知道他们实际使用的具体工厂(更不用说自己选择)。
此外,通常在任何给定时间只使用一个具体的产品系列,因此只需要一种具体的工厂。这消除了混合来自不同混凝土产品系列的不相容产品的可能性。你现在的设计似乎允许这个,这对我来说不是一个好兆头 - 但也许你有充分的理由这样做......